Una etiqueta en un lenguaje de programación es una secuencia de caracteres que identifica una ubicación dentro del código fuente . En la mayoría de los idiomas, las etiquetas toman la forma de un identificador , seguido a menudo por un carácter de puntuación (por ejemplo, dos puntos ). En muchos lenguajes de programación de alto nivel, el propósito de una etiqueta es actuar como el destino de una GOTO
declaración. [1] [2] En lenguaje ensamblador, las etiquetas se pueden usar en cualquier lugar donde pueda una dirección (por ejemplo, como operando de una instrucción JMP
o MOV
). [3] También en Pascaly sus variaciones derivadas. Algunos idiomas, como Fortran y BASIC , admiten etiquetas numéricas. [4] Las etiquetas también se utilizan para identificar un punto de entrada en una secuencia compilada de declaraciones (por ejemplo, durante la depuración ).
C
En C, una etiqueta identifica una declaración en el código. Una sola declaración puede tener varias etiquetas. Las etiquetas solo indican ubicaciones en el código y llegar a una etiqueta no tiene ningún efecto en la ejecución real.
Etiquetas de función
Las etiquetas de función constan de un identificador seguido de dos puntos. Cada una de estas etiquetas apunta a una declaración en una función y su identificador debe ser único dentro de esa función. Otras funciones pueden usar el mismo nombre para una etiqueta. Los identificadores de etiquetas ocupan su propio espacio de nombres; se pueden tener variables y funciones con el mismo nombre que una etiqueta.
void foo ( int número ) { if ( número < 0 ) goto error ; barra ( número ); volver ; error : fprintf ( stderr , "¡Número inválido! \ n " ); }
Aquí el error es la etiqueta. La instrucción goto se puede utilizar para saltar a una instrucción etiquetada en el código. Después de goto
, la ejecución del programa continúa con la instrucción después de la etiqueta.
Cambiar etiquetas
Se pueden colocar dos tipos de etiquetas en una declaración de cambio. Una etiqueta de caso consta de la palabra clave case
, seguida de una expresión que se evalúa como una constante entera. Una etiqueta predeterminada consta de la palabra clave default
. Las etiquetas de caso se utilizan para asociar un valor entero con una declaración en el código. Cuando se alcanza una instrucción de cambio, la ejecución del programa continúa con la instrucción después de la etiqueta del caso con un valor que coincide con el valor entre paréntesis del cambio. Si no existe tal etiqueta de caso, pero hay una etiqueta predeterminada, la ejecución del programa continúa con la instrucción después de la etiqueta predeterminada. Si no hay una etiqueta predeterminada, la ejecución del programa continúa después del cambio.
cambiar ( morir ) { predeterminado : printf ( "inválido \ n " ); romper ;caso 1 : caso 3 : caso 5 : printf ( "impar \ n " ); romper ;caso 2 : caso 4 : caso 6 : printf ( "par \ n " ); romper ; }
Dentro de una sola instrucción de cambio , la constante entera asociada con cada etiqueta de caso debe ser única. Puede que haya o no una declaración predeterminada. No hay restricción en el orden de las etiquetas dentro de un conmutador. El requisito de que los valores de las etiquetas de casos se evalúen en constantes enteras le da al compilador más espacio para las optimizaciones.
Ejemplos de
Javascript
En el lenguaje JavaScript, las declaraciones de sintaxis pueden estar precedidas por la etiqueta:
top : // Etiqueta el bucle for más externo. para ( var i = 0 ; i < 4 ; i ++ ) { para ( var j = 0 ; j < 4 ; j ++ ) { if ( j === 3 && i === 2 ) { alert ( " i = " + i + ", j = " + j ); // i = 2, j = 3 romper la parte superior ; } } }alerta ( "i =" + i + ", j =" + j ); // i = 2, j = 3
También es posible usar una break
declaración para romper los bloques de código:
arriba : { consola . consola log ( "foo" ) . log ( "barra" ) romper la consola superior . log ( "baz" ) } // Que daría como resultado: //> foo //> bar
Lisp común
En Common Lisp existen dos formas de definir etiquetas. El primero involucra al tagbody
operador especial. Distinguiendo su uso de muchos otros lenguajes de programación que permiten la navegación global, como C , las etiquetas solo son accesibles en el contexto de este operador. Dentro de las tagbody
etiquetas se definen como formas que comienzan con un símbolo; la go
forma especial permite una transferencia de control entre estas etiquetas. [5]
( dejar (( iteración NIL )) ( tagbody start ( imprimir 'iniciado ) ( setf iteración 0 ) aumentar ( imprimir iteración ) ( incf iteración 1 ) ( ir a comprobar ) comprobar ( si ( > = iteración 10 ) ( ir al final ) ( ir aumentar )) end ( imprimir 'hecho )))
Un segundo método utiliza las macros del lector y , el primero de los cuales etiqueta el objeto que le sigue inmediatamente, el segundo se refiere a su valor evaluado. [6] Las etiquetas en este sentido constituyen más bien una alternativa a las variables, con declarar e inicializar una “variable” y acceder a ella. El marcador de posición n designa un entero decimal sin signo elegido que identifica la etiqueta.#n=
#n#
#n=
#n#
( progn # 1 = "hola" ( print # 1 # ))
Aparte de eso, algunos formularios permiten o exigen la declaración de una etiqueta para referencia posterior, incluida la forma especial block
que prescribe un nombre y la loop
macro que puede identificarse mediante una named
cláusula. La salida inmediata de un formulario con nombre es posible utilizando el return-from
operador especial.
( block myblock ( bucle para iteración desde 0 do ( if ( > = iteración 10 ) ( return-from myblock 'hecho ) ( iteración de impresión ))))
( bucle llamado myloop para iteración desde 0 do ( if ( > = iteración 10 ) ( return-from myloop 'hecho ) ( iteración de impresión )))
De una manera similar a C, las macros case
, ccase
, ecase
, [7] typecase
, ctypecase
y etypecase
definir los estados de conmutación. [8]
( let (( my-value 5 )) ( case my-value ( 1 ( imprime "uno" )) ( 2 ( imprime "dos" )) (( 3 4 5 ) ( imprime "tres cuatro o cinco" )) ( de lo contrario ( escriba "cualquier otro valor" ))))
( let (( my-value 5 )) ( typecase my-value ( lista ( imprime "una lista" )) ( cadena ( imprime "una cadena" )) ( número ( imprime "un número" )) (de lo contrario ( imprime " una cadena" ) cualquier otro tipo " ))))
Ver también
Referencias
- ^ C Sección estándar 6.8.6.1 La declaración goto
- ^ "Pantalla rápida de declaración GOTO" . Microsoft. 1988 . Consultado el 3 de julio de 2008 .
- ^ O. Lawlor. "Ensamblaje nasm x86" . Consultado el 3 de julio de 2008 .
- ^ "Diferencias entre GW-BASIC y QBasic" . Archivado desde el original el 10 de febrero de 2010.
- ^ Kent Pitman. "CLHS: Operador especial TAGBODY" . Consultado el 18 de agosto de 2020 .
- ^ Kent Pitman. "CLHS: Sección 2.4.8" . Consultado el 18 de agosto de 2020 .
- ^ Kent Pitman. "CLHS: Macro CASE, CCASE, ECASE" . Consultado el 20 de agosto de 2020 .
- ^ Kent Pitman. "CLSH: Macro TYPECASE, CTYPECASE, ETYPECASE" . Consultado el 20 de agosto de 2020 .