Štítek (informatika) - Label (computer science)
Štítek v programovacím jazyce je posloupnost znaků, která identifikuje umístění ve zdrojovém kódu . Ve většině jazyků mají štítky podobu identifikátoru , za kterým často následuje interpunkční znak (např. Dvojtečka ). V mnoha programovacích jazycích na vysoké úrovni má štítek sloužit jako cíl GOTO
příkazu. V assembleru lze popisky použít kdekoli, kde může adresa (například jako operand JMP
nebo MOV
instrukce). Také v Pascalu a jeho odvozených variantách. Některé jazyky, například Fortran a BASIC , podporují číselné štítky. Štítky se také používají k identifikaci vstupního bodu do kompilované posloupnosti příkazů (např. Během ladění ).
C
V C štítek identifikuje prohlášení v kódu. Jeden výpis může mít více štítků. Štítky pouze označují umístění v kódu a dosažení štítku nemá žádný vliv na skutečné provedení.
Štítky funkcí
Popisky funkcí se skládají z identifikátoru následovaného dvojtečkou. Každý takový štítek odkazuje na příkaz ve funkci a jeho identifikátor musí být v rámci této funkce jedinečný. Stejný název štítku mohou používat i jiné funkce. Identifikátory štítků zabírají svůj vlastní jmenný prostor - jeden může mít proměnné a funkce se stejným názvem jako štítek.
void foo(int number)
{
if (number < 0)
goto error;
bar(number);
return;
error:
fprintf(stderr, "Invalid number!\n");
}
Zde je chyba štítek. Příkaz goto lze použít k přeskočení na popisovaný příkaz v kódu. Po a goto
pokračuje provádění programu s příkazem za štítkem.
Přepnout štítky
Do příkazu switch lze vložit dva typy štítků. Popisek případu se skládá z klíčového slova case
, následovaného výrazem, který je vyhodnocen jako celočíselná konstanta. Výchozí štítek se skládá z klíčového slova default
. Štítky případů se používají k přidružení celočíselné hodnoty k příkazu v kódu. Když je dosaženo příkazu switch, provádění programu pokračuje příkazem za popiskem případu s hodnotou, která odpovídá hodnotě v závorkách přepínače. Pokud neexistuje žádný takový popisek případu, ale existuje výchozí popisek, provádění programu pokračuje s příkazem za výchozím popiskem. Pokud neexistuje žádný výchozí štítek, po přepnutí pokračuje provádění programu.
switch (die)
{
default:
printf("invalid\n");
break;
case 1:
case 3:
case 5:
printf("odd\n");
break;
case 2:
case 4:
case 6:
printf("even\n");
break;
}
V rámci jednoho příkazu switch musí být celočíselná konstanta spojená s každým popisem případu jedinečná. Výchozí prohlášení může, ale nemusí existovat. Pořadí štítků v přepínači není nijak omezeno. Požadavek, aby byly hodnoty popisků hodnot vyhodnoceny na celočíselné konstanty, dává kompilátoru více prostoru pro optimalizaci.
Příklady
Javascript
V jazyce JavaScriptu může před příkazy syntaxe následovat štítek:
top: //Label the outermost for-loop.
for (var i = 0; i < 4; i++) {
for (var j = 0; j < 4; j++) {
if (j === 3 && i === 2) {
alert("i=" + i + ", j=" + j); //i=2, j=3
break top;
}
}
}
alert("i=" + i + ", j=" + j); //i=2, j=3
Je také možné použít break
příkaz k vylomení bloků kódu:
top: {
console.log("foo")
console.log("bar")
break top
console.log("baz")
}
// Which would output:
// > foo
// > bar
Společný Lisp
V programu Common Lisp existují dva způsoby definování štítků. První zahrnuje tagbody
speciální operátor. Odlišujíc jeho použití od mnoha jiných programovacích jazyků, které umožňují globální navigaci, například C , jsou štítky přístupné pouze v kontextu tohoto operátoru. Uvnitř tagbody
štítků jsou definovány jako formuláře začínající symbolem; go
zvláštní forma umožňuje předání řízení mezi těmito značkami.
(let ((iteration NIL))
(tagbody
start
(print 'started)
(setf iteration 0)
increase
(print iteration)
(incf iteration 1)
(go check)
check
(if (>= iteration 10)
(go end)
(go increase))
end
(print 'done)))
Druhá metoda využívá makra čtečky a první z nich označuje objekt, který bezprostředně následuje, druhá odkazuje na jeho vyhodnocenou hodnotu. Štítky v tomto smyslu představují spíše alternativu k proměnným, přičemž deklarují a inicializují „proměnnou“ a přistupují k ní. Zástupný symbol n označuje vybrané celé číslo bez znaménka, které identifikuje štítek.
#n=
#n#
#n=
#n#
(progn
#1="hello"
(print #1#))
Kromě toho některé formuláře povolují nebo pověřují deklaraci štítku pro pozdější použití, včetně zvláštního formuláře, block
který předepisuje pojmenování, a loop
makra, které lze identifikovat named
klauzulí. Okamžitý odchod z pojmenovaného formuláře je možný pomocí return-from
speciálního operátora.
(block myblock
(loop for iteration from 0 do
(if (>= iteration 10)
(return-from myblock 'done)
(print iteration))))
(loop
named myloop
for iteration from 0
do (if (>= iteration 10)
(return-from myloop 'done)
(print iteration)))
V módě podobné C, makra case
, ccase
, ecase
, typecase
, ctypecase
a etypecase
definovat příkazy spínačů.
(let ((my-value 5))
(case my-value
(1 (print "one"))
(2 (print "two"))
((3 4 5) (print "three four or five"))
(otherwise (print "any other value"))))
(let ((my-value 5))
(typecase my-value
(list (print "a list"))
(string (print "a string"))
(number (print "a number"))
(otherwise (print "any other type"))))