Etykieta (informatyka) - Label (computer science)

Etykieta w języku programowania jest ciągiem znaków, który identyfikuje lokalizację wewnątrz kodu źródłowego . W większości języków etykiety mają postać identyfikatora , po którym często następuje znak interpunkcyjny (np. Dwukropek ). W wielu językach programowania wysokiego poziomu celem etykiety jest działanie jako miejsce docelowe GOTO instrukcji. W języku asemblerowym etykiety mogą być używane wszędzie tam, gdzie może być adres (na przykład jako argument a JMP lub MOV instrukcji). Również w Pascalu i jego odmianach pochodnych. Niektóre języki, takie jak Fortran i BASIC , obsługują etykiety numeryczne. Etykiety są również używane do identyfikowania punktu wejścia do skompilowanej sekwencji instrukcji (np. Podczas debugowania ).

do

W języku C etykieta identyfikuje instrukcję w kodzie. Pojedyncza instrukcja może mieć wiele etykiet. Etykiety wskazują tylko lokalizacje w kodzie, a dotarcie do etykiety nie ma wpływu na rzeczywiste wykonanie.

Etykiety funkcji

Etykiety funkcji składają się z identyfikatora, po którym następuje dwukropek. Każda taka etykieta wskazuje na instrukcję w funkcji, a jej identyfikator musi być unikalny w ramach tej funkcji. Inne funkcje mogą używać tej samej nazwy dla etykiety. Identyfikatory etykiet zajmują własną przestrzeń nazw - można mieć zmienne i funkcje o takiej samej nazwie jak etykieta.

void foo(int number)
{
    if (number < 0)
        goto error;
    bar(number);
    return;
error:
    fprintf(stderr, "Invalid number!\n");
}

Tutaj błąd jest etykietą. Instrukcja goto może służyć do przechodzenia do instrukcji oznaczonej etykietą w kodzie. Po a goto , wykonywanie programu jest kontynuowane z instrukcją po etykiecie.

Przełącz etykiety

W instrukcji przełącznika można umieścić dwa typy etykiet. Etykieta przypadku składa się ze słowa kluczowego case , po którym następuje wyrażenie, którego wynikiem jest stała liczba całkowita. Domyślna etykieta składa się ze słowa kluczowego default . Etykiety przypadków służą do kojarzenia wartości całkowitej z instrukcją w kodzie. Po osiągnięciu instrukcji switch wykonywanie programu jest kontynuowane z instrukcją znajdującą się po etykiecie przypadku, której wartość jest zgodna z wartością w nawiasach przełącznika. Jeśli nie ma takiej etykiety przypadku, ale istnieje etykieta domyślna, wykonywanie programu jest kontynuowane z instrukcją po etykiecie domyślnej. Jeśli nie ma etykiety domyślnej, program jest kontynuowany po przełączeniu.

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;
}

W pojedynczej instrukcji przełączającej stała całkowita skojarzona z każdą etykietą przypadku musi być unikalna. Może istnieć stwierdzenie domyślne lub nie. Nie ma ograniczeń co do kolejności etykiet w przełączniku. Wymóg, aby wartości etykiet przypadków były obliczane jako stałe całkowite, daje kompilatorowi więcej miejsca na optymalizacje.

Przykłady

JavaScript

W języku JavaScript instrukcje składniowe mogą być poprzedzone etykietą:

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

Możliwe jest również użycie break instrukcji do wybicia się z bloków kodu:

top: {
  console.log("foo")
  console.log("bar")
  break top
  console.log("baz")

}
// Which would output: 
// > foo
// > bar

Common Lisp

W Common Lisp istnieją dwa sposoby definiowania etykiet. Pierwsza dotyczy tagbody specjalnego operatora. W odróżnieniu od wielu innych języków programowania, które pozwalają na globalną nawigację, takich jak C , etykiety są dostępne tylko w kontekście tego operatora. Wewnątrz tagbody etykiety definiuje się formy zaczynające się od symbolu; go szczególna forma pozwala na przeniesienie sterowania między tymi etykietami.

(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)))

Druga metoda wykorzystuje makra czytnika i , z której były etykietami przedmiotu bezpośrednio po to, ta ostatnia odnosi się do jego ocenianej wartości. Etykiety w tym sensie stanowią raczej alternatywę dla zmiennych, deklarując i inicjalizując „zmienną” i uzyskując do niej dostęp. Symbol zastępczy n oznacza wybraną dziesiętną liczbę całkowitą bez znaku identyfikującą etykietę. #n=#n##n=#n#

(progn
  #1="hello"
  (print #1#))

Poza tym niektóre formularze zezwalają lub nakazują deklarację etykiety w celu późniejszego odesłania, w tym specjalny formularz, block który określa nazewnictwo, oraz loop makro, które można zidentyfikować za pomocą named klauzuli. Natychmiastowe wyjście z nazwanego formularza jest możliwe przy użyciu return-from specjalnego operatora.

(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)))

W sposób podobny do C, makra case , ccase , ecase , typecase , ctypecase i etypecase określić oświadczenia przełącznika.

(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"))))

Zobacz też

Bibliografia