Из Википедии, бесплатной энциклопедии
  (Перенаправлено с Label (язык программирования) )
Перейти к навигации Перейти к поиску

Метка в языке программирования представляет собой последовательность символов , которая определяет местоположение в пределах исходного кода . В большинстве языков метки принимают форму идентификатора , за которым часто следует знак препинания (например, двоеточие ). Во многих языках программирования высокого уровня цель метки - действовать как место назначения 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  " любой другой тип " ))))

См. Также [ править ]

  • Идти к
  • Номер строчки
  • Заявление о переключении

Ссылки [ править ]

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