Этикетка (информатика)
В языках программирования метка представляет собой последовательность символов, которая идентифицирует местоположение в исходном коде . В большинстве языков метки имеют форму идентификатора , за которым часто следует знак пунктуации (например, двоеточие ). Во многих языках высокого уровня цель метки — выступать в качестве пункта назначения. GOTO
заявление. [1] [2] На языке ассемблера метки могут использоваться везде, где может быть адрес (например, в качестве операнда JMP
или MOV
инструкция). [3] Также в Паскале и его производных вариациях. Некоторые языки, такие как Fortran и BASIC , поддерживают числовые метки. [4] Метки также используются для идентификации точки входа в скомпилированную последовательность операторов (например, во время отладки ).
С [ править ]
В C метка идентифицирует оператор в коде. Один оператор может иметь несколько меток. Метки просто указывают места в коде, и достижение метки не влияет на фактическое выполнение.
Метки функций [ править ]
Метки функций состоят из идентификатора, за которым следует двоеточие. Каждая такая метка указывает на оператор функции, и ее идентификатор должен быть уникальным внутри этой функции. Другие функции могут использовать то же имя для метки. Идентификаторы меток занимают собственное пространство имен — можно иметь переменные и функции с тем же именем, что и метка.
void foo(int number)
{
if (number < 0)
goto error;
bar(number);
return;
error:
fprintf(stderr, "Invalid number!\n");
}
Здесь ошибка — это метка. Оператор goto можно использовать для перехода к помеченному оператору в коде. После goto
, выполнение программы продолжается с оператора после метки.
Сменить ярлыки [ править ]
В оператор переключателя можно поместить два типа меток. Метка случая состоит из ключевого слова case
, за которым следует выражение, результатом которого является целочисленная константа. Метка по умолчанию состоит из ключевого слова default
. Метки регистра используются для связи целочисленного значения с оператором в коде. Когда достигается оператор переключения, выполнение программы продолжается с оператора после метки случая со значением, которое соответствует значению в круглых скобках переключателя. Если такой метки случая нет, но есть метка по умолчанию, выполнение программы продолжается с оператора после метки по умолчанию. Если метка по умолчанию отсутствует, выполнение программы продолжается после переключения.
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;
}
В одном операторе переключения целочисленная константа, связанная с каждой меткой варианта, должна быть уникальной. Оператор по умолчанию может быть, а может и не быть. Нет ограничений на порядок меток внутри переключателя. Требование, чтобы значения меток регистра оценивались как целочисленные константы, дает компилятору больше возможностей для оптимизации.
Примеры [ править ]
Javascript [ править ]
В языке JavaScript синтаксическим операторам может предшествовать метка:
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
Также возможно использовать break
оператор для выхода из блоков кода:
top: {
console.log("foo")
console.log("bar")
break top
console.log("baz")
}
// Which would output:
// > foo
// > bar
Общий Лисп [ править ]
В Common Lisp существует два способа определения меток. Первый из них предполагает tagbody
специальный оператор. В отличие от многих других языков программирования, допускающих глобальную навигацию, таких как C , метки доступны только в контексте этого оператора. Внутри tagbody
метки определяются как формы, начинающиеся с символа; тот go
специальная форма позволяет передавать управление между этими метками. [5]
(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)))
Второй метод использует макросы считывателя. #n=
и #n#
, первый из которых помечает объект, следующий сразу за ним, второй относится к его вычисленному значению. [6] Метки в этом смысле представляют собой скорее альтернативу переменным, поскольку #n=
объявление и инициализация «переменной» и #n#
доступ к нему. Заполнитель n обозначает выбранное десятичное целое число без знака, идентифицирующее метку.
(progn
#1="hello"
(print #1#))
Кроме того, некоторые формы разрешают или требуют объявления маркировки для последующего направления, включая специальную форму. block
который предписывает именование, и loop
макрос, который можно идентифицировать по named
пункт. Немедленный уход от названной формы возможен с помощью return-from
специальный оператор.
(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)))
Подобно C, макросы case
, ccase
, ecase
, [7] typecase
, ctypecase
и etypecase
определить операторы переключения. [8]
(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"))))
См. также [ править ]
Ссылки [ править ]
- ^ «Стандартный раздел C 6.8.6.1 Оператор goto» . Архивировано из оригинала 24 декабря 2007 г. Проверено 3 июля 2008 г.
- ^ «Перейти к оператору QuickSCREEN» . Майкрософт. 1988. Архивировано из оригинала 25 июля 2009 г. Проверено 3 июля 2008 г.
- ^ О. Лоулор. «Сборка nasm x86» . Проверено 3 июля 2008 г.
- ^ «Различия между GW-BASIC и QBasic» . Архивировано из оригинала 10 февраля 2010 г.
- ^ Кент Питман. «CLHS: Специальный оператор ТЭГБОДИ» . Проверено 18 августа 2020 г.
- ^ Кент Питман. «CLHS: Раздел 2.4.8» . Проверено 18 августа 2020 г.
- ^ Кент Питман. «CLHS: Макрос CASE, CCASE, ECASE» . Проверено 20 августа 2020 г.
- ^ Кент Питман. «CLSH: Макрос TYPECASE, CTYPECASE, ETYPECASE» . Проверено 20 августа 2020 г.