Метка в языке программирования представляет собой последовательность символов , которая определяет местоположение в пределах исходного кода . В большинстве языков метки принимают форму идентификатора , за которым часто следует знак препинания (например, двоеточие ). Во многих языках программирования высокого уровня цель метки - действовать как место назначения GOTO
оператора. [1] [2] В языке ассемблера метки могут использоваться везде, где может быть адрес (например, как операнд инструкции JMP
или MOV
). [3] Также в Паскалеи его производные вариации. Некоторые языки, такие как Fortran и BASIC , поддерживают числовые метки. [4] Метки также используются для идентификации точки входа в скомпилированную последовательность операторов (например, во время отладки ).
C [ править ]
В C метка идентифицирует оператор в коде. У одного оператора может быть несколько ярлыков. Ярлыки просто указывают места в коде, и достижение ярлыка не влияет на фактическое выполнение.
Метки функций [ править ]
Метки функций состоят из идентификатора, за которым следует двоеточие. Каждая такая метка указывает на оператор в функции, и ее идентификатор должен быть уникальным в этой функции. Другие функции могут использовать то же имя для метки. Идентификаторы меток занимают свое собственное пространство имен - можно иметь переменные и функции с тем же именем, что и метка.
void foo ( int number ) { if ( number < 0 ) ошибка перехода ; бар ( число ); возврат ; ошибка : fprintf ( stderr , «Неверный номер! \ n » ); }
Здесь ошибка - это этикетка. Оператор goto может использоваться для перехода к помеченному оператору в коде. После a goto
выполнение программы продолжается с оператора после метки.
Сменить ярлыки [ изменить ]
В оператор switch можно поместить два типа меток. Метка case состоит из ключевого слова case
, за которым следует выражение, которое вычисляется как целочисленная константа. Метка по умолчанию состоит из ключевого слова default
. Метки регистра используются для связывания целочисленного значения с оператором в коде. Когда достигается оператор switch, выполнение программы продолжается с оператора после метки case со значением, которое соответствует значению в круглых скобках переключателя. Если такой метки case нет, но есть метка по умолчанию, выполнение программы продолжается с оператором после метки по умолчанию. Если метки по умолчанию нет, выполнение программы продолжается после переключения.
переключатель ( умереть ) {по умолчанию : printf ( "неверно \ п " ); перерыв ;case 1 : case 3 : case 5 : printf ( "нечетное \ п " ); перерыв ;case 2 : case 4 : case 6 : printf ( "даже \ n " ); перерыв ; }
В пределах одного оператора switch целочисленная константа, связанная с каждой меткой case, должна быть уникальной. Заявление по умолчанию может быть, а может и не быть. Нет никаких ограничений на порядок меток внутри переключателя. Требование, чтобы значения меток регистра оценивались как целочисленные константы, дает компилятору больше возможностей для оптимизации.
Примеры [ править ]
Javascript [ править ]
В языке JavaScript операторам синтаксиса может предшествовать метка:
top : // Обозначить самый внешний цикл for. 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 перерыв верх ; } } }предупреждение ( "я =" + я + ", j =" + j ); // i = 2, j = 3
Также можно использовать break
оператор для выхода из блоков кода:
вверху : { console . log ( "foo" ) консоль . log ( "бар" ) сломать верхнюю консоль . журнал ( "баз" )} // Что выведет: //> foo //> bar
Common Lisp [ править ]
В Common Lisp существует два способа определения меток. В первом задействован tagbody
специальный оператор. В отличие от многих других языков программирования, допускающих глобальную навигацию, таких как C , метки доступны только в контексте этого оператора. Внутри tagbody
метки определяются как формы, начинающиеся с символа; go
специальная форма позволяет передачу управления между этими метками. [5]
( let (( итерация NIL )) ( начало тега ( печать 'запущена ) ( setf итерация 0 ) увеличить ( итерация печати ) ( incf итерация 1 ) ( пройти проверку ) проверить ( if ( > = итерация 10 ) ( перейти к концу ) ( перейти увеличить )) конец ( печать 'готово )))
Второй метод использует макросы считывателя, и первый из них маркирует объект, следующий сразу за ним, второй относится к его оцененному значению. [6] В этом смысле метки представляют собой скорее альтернативу переменным, с объявлением и инициализацией «переменной» и доступом к ней. Заполнитель n обозначает выбранное десятичное целое число без знака, идентифицирующее метку.#n=
#n#
#n=
#n#
( progn # 1 = "привет" ( print # 1 # ))
Кроме того, некоторые формы разрешают или block
предписывают объявление метки для последующего обращения, включая специальную форму, которая предписывает именование, и loop
макрос, который может быть идентифицирован с помощью named
пункта. Возможен немедленный выход из именованной формы с помощью return-from
специального оператора.
( block myblock ( цикл для итерации от 0 do ( if ( > = итерация 10 ) ( return-from myblock 'done ) ( итерация печати ))))
( цикл с именем myloop для итерации от 0 do ( if ( > = итерация 10 ) ( return-from myloop 'done ) ( итерация печати )))
В моде аналогично C, макросы case
, ccase
, ecase
, [7] typecase
, ctypecase
и etypecase
определим операторы коммутатора. [8]
( let (( my-value 5 )) ( case my-value ( 1 ( вывести «один» )) ( 2 ( вывести «два» )) (( 3 4 5 ) ( вывести «три, четыре или пять» )) ( в противном случае ( выведите «любое другое значение» ))))
( let (( my-value 5 )) ( typecase my-value ( list ( print "список" )) ( string ( print "a string" )) ( number ( print "a number" )) (в противном случае ( print " любой другой тип " ))))
См. Также [ править ]
- Идти к
- Номер строчки
- Заявление о переключении
Ссылки [ править ]
- ^ C Стандартный раздел 6.8.6.1 Оператор goto
- ^ "GOTO Statement QuickSCREEN" . Microsoft. 1988 . Проверено 3 июля 2008 .
- ↑ О. Лоулор. "Сборка nasm x86" . Проверено 3 июля 2008 .
- ^ «Различия между GW-BASIC и QBasic» . Архивировано из оригинала на 2010-02-10.
- ^ Кент Питман. «CLHS: TAGBODY специального оператора» . Проверено 18 августа 2020 .
- ^ Кент Питман. «CLHS: Раздел 2.4.8» . Проверено 18 августа 2020 .
- ^ Кент Питман. «CLHS: Macro CASE, CCASE, ECASE» . Проверено 20 августа 2020 .
- ^ Кент Питман. «CLSH: макрос TYPECASE, CTYPECASE, ETYPECASE» . Проверено 20 августа 2020 .