stringtranslate.com

Метка (компьютерные науки)

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

С

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

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

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

void foo ( int number ) { if ( number < 0 ) goto error ; bar ( number ); return ; error : fprintf ( stderr , "Недопустимое число! \n " ); }            

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

Переключить метки

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

switch ( die ) { default : printf ( "недопустимый \n " ); break ;   случай 1 : случай 3 : случай 5 : printf ( "нечетный \ n " ) ;     случай 2 : случай 4 : случай 6 : printf ( "даже \n " ); break ; }     

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

Примеры

Яваскрипт

В языке 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 break top ; } } }                                         оповещение ( "i=" + i + ", j=" + j ); //i=2, j=3       

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

top : { console . log ( "foo" ) console . log ( "bar" ) break top console . log ( "baz" )      } // Что выведет: // > 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 )))                             

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

( progn #1= "привет" ( print #1# ))   

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

( block myblock ( loop for iteration from 0 do ( if ( >= iteration 10 ) ( return-from myblock 'done ) ( print iteration ))))                
( цикл с именем myloop для итерации с 0 do ( if ( >= итерация 10 ) ( return-from myloop 'done ) ( print итерация )))                

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

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

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

Ссылки

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