stringtranslate.com

Этикетка (информатика)

В языках программирования метка представляет собой последовательность символов , которая идентифицирует местоположение в исходном коде . В большинстве языков метки имеют форму идентификатора , за которым часто следует знак пунктуации (например, двоеточие ). Во многих языках высокого уровня метка служит местом назначения оператора GOTO. [1] [2] В языке ассемблера метки могут использоваться везде, где может быть адрес (например, в качестве операнда JMPили MOVинструкции). [3] Также в Паскале и его производных вариациях. Некоторые языки, такие как Fortran и BASIC , поддерживают числовые метки. [4] Метки также используются для идентификации точки входа в скомпилированную последовательность операторов (например, во время отладки ).

С

В C метка идентифицирует оператор в коде. Один оператор может иметь несколько меток. Метки просто указывают места в коде, и достижение метки не влияет на фактическое выполнение.

Метки функций

Метки функций состоят из идентификатора, за которым следует двоеточие. Каждая такая метка указывает на оператор функции, и ее идентификатор должен быть уникальным внутри этой функции. Другие функции могут использовать то же имя для метки. Идентификаторы меток занимают собственное пространство имен — можно иметь переменные и функции с тем же именем, что и метка.

void foo ( int number ) { if ( number < 0 ) перейти к ошибке ; бар ( номер ); возвращаться ; ошибка : fprintf ( stderr , «Неверный номер! \n » ); }            

Здесь ошибка — это метка. Оператор goto можно использовать для перехода к помеченному оператору в коде. После a gotoвыполнение программы продолжается с оператора после метки.

Переключить ярлыки

В оператор переключателя можно поместить два типа меток. Метка варианта состоит из ключевого слова case, за которым следует выражение, результатом которого является целочисленная константа. Метка по умолчанию состоит из ключевого слова default. Метки регистра используются для связи целочисленного значения с оператором в коде. Когда достигается оператор переключения, выполнение программы продолжается с оператора после метки случая со значением, которое соответствует значению в круглых скобках переключателя. Если такой метки случая нет, но есть метка по умолчанию, выполнение программы продолжается с оператора, следующего за меткой по умолчанию. Если метка по умолчанию отсутствует, выполнение программы продолжается после переключения.

switch ( die ) { default : printf ( "invalid \n " ); перерыв ;   случай 1 : случай 3 : случай 5 : printf ( «нечетный \n » ); перерыв ;     случай 2 : случай 4 : случай 6 : printf ( «даже \n » ); перерыв ; }     

В пределах одного оператора переключения целочисленная константа, связанная с каждой меткой варианта, должна быть уникальной. Оператор по умолчанию может быть, а может и не быть. Нет ограничений на порядок меток внутри переключателя. Требование, чтобы значения меток регистра оценивались как целочисленные константы, дает компилятору больше возможностей для оптимизации.

Примеры

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=" + я + ", j=" + j ); //i=2, j=3 прерываем вершину ; } } }                                         предупреждение ( "i=" + я + ", j=" + j ); //i=2, j=3       

Также можно использовать breakоператор для выхода из блоков кода:

вверху : { консоль . log ( "foo" ) консоль . log ( "bar" ) разбить верхнюю консоль . журнал ( «баз» )      } // Что выведет: // > foo // > bar

Общий Лисп

В Common Lisp существует два способа определения меток. Первый предполагает использование tagbodyспециального оператора. В отличие от многих других языков программирования, допускающих глобальную навигацию, таких как C , метки доступны только в контексте этого оператора. Внутри метки tagbodyопределяются как формы, начинающиеся с символа; специальная goформа позволяет передавать управление между этими метками. [5]

( let (( итерация NIL )) ( tagbody start ( print 'started ) ( setf итерация 0 ) увеличение ( итерация печати ) ( incf итерация 1 ) ( go check ) check ( if ( >= итерация 10 ) ( go end ) ( go увеличить )) конец ( печатать готово )))                             

Второй метод использует макросы считывателя и , первый из которых помечает объект, следующий сразу за ним, второй ссылается на его оцененное значение. [6] Метки в этом смысле представляют собой скорее альтернативу переменным, поскольку они объявляют и инициализируют «переменную» и получают к ней доступ. Заполнитель n обозначает выбранное десятичное целое число без знака, идентифицирующее метку.#n=#n##n=#n#

( программа №1= "привет" ( напечатайте #1# ))   

Кроме того, некоторые формы разрешают или требуют объявления метки для последующего использования, включая специальную форму block, которая предписывает именование, и loopмакрос, который можно идентифицировать с помощью namedпредложения. Немедленный выход из названной формы возможен с помощью return-fromспециального оператора.

( блокировать myblock ( цикл для итерации от 0 do ( if ( >= итерация 10 ) ( return-from myblock 'done ) ( итерация печати ))))                
( цикл с именем myloop для итерации от 0 do ( if ( >= итерация 10 ) ( return-from myloop 'done ) ( итерация печати )))                

Подобно C, макросы case, ccase, ecase, [ 7] typecase и определяют операторы переключения. [8]ctypecaseetypecase

( let (( my-value 5 )) ( case my-value ( 1 ( выведите «один» )) ( 2 ( выведите «два» ) )) (( 3 4 5 ) ( выведите «три четыре или пять» ) )) ( в противном случае ( выведите «любое другое значение» ))))                  
( let (( my-value 5 )) ( typecase my-value ( list ( напечатайте "список" )) ( строка ( напечатайте "строку" )) ( число ( напечатайте "число" )) ( иначе ( напечатайте " любой другой тип" ))))                

Смотрите также

Рекомендации

  1. ^ «Стандартный раздел C 6.8.6.1 Оператор goto» . Архивировано из оригинала 24 декабря 2007 г. Проверено 3 июля 2008 г.
  2. ^ "Заявление GOTO QuickSCREEN" . Майкрософт. 1988. Архивировано из оригинала 25 июля 2009 г. Проверено 3 июля 2008 г.
  3. ^ О. Лоулор. «Сборка nasm x86» . Проверено 3 июля 2008 г.
  4. ^ «Различия между GW-BASIC и QBasic». Архивировано из оригинала 10 февраля 2010 г.
  5. ^ Кент Питман. «CLHS: Специальный оператор ТЭГБОДИ» . Проверено 18 августа 2020 г.
  6. ^ Кент Питман. «CLHS: Раздел 2.4.8» . Проверено 18 августа 2020 г.
  7. ^ Кент Питман. «CLHS: Макрос CASE, CCASE, ECASE» . Проверено 20 августа 2020 г.
  8. ^ Кент Питман. «CLSH: Макрос TYPECASE, CTYPECASE, ETYPECASE» . Проверено 20 августа 2020 г.