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

редактировать

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

Содержание

  • 1 C
    • 1.1 Метки функций
    • 1.2 Метки переключателей
  • 2 Примеры
    • 2.1 Javascript
  • 3 Common Lisp
  • 4 См. Также
  • 5 Ссылки

C

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

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

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

void foo (int number) {if (number < 0) goto error; bar(number); return; error: fprintf(stderr, "Invalid number!\n"); }

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

Метки переключателя

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

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

Внутри одного оператора переключения целочисленная константа, связанная с каждой меткой 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 break top; } } } alert("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

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

(let ((итерация NIL)) (начало тега (печать 'запущена) (setf итерация 0) увеличить (итерация печати) (incf итерация 1) (пройти проверку) проверить (if (>= итерация 10) (перейти к концу) (перейти к увеличению)) end (print 'done)))

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

(progn # 1 = "hello" (print # 1 #))

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

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

Аналогично C макросы case, ccase, ecase, typecase, ctypecaseи etypecaseопределяют операторы переключения.

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

См. также

Ссылки

Последняя правка сделана 2021-05-26 10:18:34
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте