En los lenguajes de programación , una etiqueta es una secuencia de caracteres que identifica una ubicación dentro del código fuente . En la mayoría de los lenguajes, las etiquetas toman la forma de un identificador , a menudo seguido de un carácter de puntuación (por ejemplo, dos puntos ). En muchos lenguajes 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 haber una dirección (por ejemplo, como el operando de una instrucción JMP
o MOV
). [3] También en Pascal y sus variaciones derivadas. Algunos lenguajes, 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 ).
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.
Las etiquetas de función consisten en 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 etiqueta ocupan su propio espacio de nombres: se pueden tener variables y funciones con el mismo nombre que una etiqueta.
void foo ( int numero ) { if ( numero < 0 ) goto error ; bar ( numero ); return ; 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 un goto
, la ejecución del programa continúa con la instrucción después de la etiqueta.
Se pueden colocar dos tipos de etiquetas en una sentencia switch. Una etiqueta case consta de la palabra clave case
, seguida de una expresión que evalúa a una constante entera. Una etiqueta default consta de la palabra clave default
. Las etiquetas case se utilizan para asociar un valor entero con una sentencia en el código. Cuando se llega a una sentencia switch, la ejecución del programa continúa con la sentencia después de la etiqueta case con el valor que coincide con el valor entre paréntesis de la sentencia switch. Si no existe dicha etiqueta case, pero sí una etiqueta default, la ejecución del programa continúa con la sentencia después de la etiqueta default. Si no existe una etiqueta default, la ejecución del programa continúa después de la sentencia switch.
switch ( die ) { predeterminado : printf ( "inválido \n " ); break ; caso 1 : caso 3 : caso 5 : printf ( "odd \n " ); break ; caso 2 : caso 4 : caso 6 : printf ( "even \n " ); break ; }
Dentro de una sola declaración switch , la constante entera asociada con cada etiqueta de caso debe ser única. Puede haber o no una declaración predeterminada. No hay ninguna restricción en el orden de las etiquetas dentro de un switch. El requisito de que los valores de las etiquetas de caso se evalúen como constantes enteras le da al compilador más espacio para las optimizaciones.
En la sintaxis del lenguaje JavaScript las declaraciones pueden ir precedidas de la etiqueta:
top : //Etiqueta el bucle for más externo. 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 ; } } } alerta ( "i=" + i + ", j=" + j ); //i=2, j=3
También es posible utilizar break
la declaración para salir de los bloques de código:
arriba : { console.log ( " foo " ) console.log ( " bar " ) break arriba console.log ( " baz " ) } // Lo que daría como resultado: // > foo // > bar
En Common Lisp existen dos formas de definir etiquetas. La primera implica el tagbody
operador especial. Distinguiendo su uso de muchos otros lenguajes de programación que permiten la navegación global, como C , las etiquetas sólo son accesibles en el contexto de este operador. Dentro de un código, tagbody
las etiquetas se definen como formas que comienzan con un símbolo; la go
forma especial permite una transferencia de control entre estas etiquetas. [5]
( let (( iteración NIL )) ( cuerpo de etiqueta inicio ( imprimir 'iniciado ) ( setf iteración 0 ) incremento ( imprimir iteración ) ( incf iteración 1 ) ( ir comprobar ) comprobar ( si ( >= iteración 10 ) ( ir fin ) ( ir aumentar )) fin ( imprimir 'hecho )))
Un segundo método utiliza las macros de lectura y , la primera de las cuales etiqueta el objeto que le sigue inmediatamente, la segunda se refiere a su valor evaluado. [6] Las etiquetas en este sentido constituyen más bien una alternativa a las variables, con la declaración e inicialización de una “variable” y el acceso 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, algunas formas permiten o exigen la declaración de una etiqueta para una referencia posterior, incluida la forma especial block
que prescribe un nombre y la loop
macro que se puede identificar mediante una named
cláusula. Es posible abandonar inmediatamente una forma con nombre utilizando el return-from
operador especial.
( bloque myblock ( bucle para iteración desde 0 hacer ( si ( >= iteración 10 ) ( retorno-de myblock 'hecho ) ( imprimir iteración ))))
( bucle llamado myloop para la iteración desde 0 hacer ( si ( >= iteración 10 ) ( retorno de myloop 'hecho ) ( imprimir iteración )))
De manera similar a C, las macros case
, ccase
, ecase
, [7] typecase
y ctypecase
definen etypecase
sentencias switch. [8]
( let (( mi-valor 5 )) ( case mi-valor ( 1 ( print "uno" )) ( 2 ( print "dos" )) (( 3 4 5 ) ( print "tres cuatro o cinco" )) ( else ( print "cualquier otro valor" ))))
( let (( my-value 5 )) ( typecase my-value ( list ( print "una lista" )) ( string ( print "una cadena" )) ( number ( print "un número" )) ( else ( print "cualquier otro tipo" ))))