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 destino de una GOTOinstrucción. [ 1 ] [ 2 ] En lenguaje ensamblador , las etiquetas se pueden usar en cualquier lugar donde se pueda usar una dirección (por ejemplo, como operando de una instrucción JMPo ). [ 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 instrucciones (por ejemplo, durante la depuración ).MOV
do
En C , una etiqueta identifica una instrucción en el código. Una misma instrucción puede tener varias etiquetas. Las etiquetas simplemente indican ubicaciones en el código y alcanzar una etiqueta no afecta la ejecución real.
Etiquetas de función
Las etiquetas de función constan de un identificador seguido de dos puntos. Cada etiqueta apunta a una instrucción dentro de 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; es posible tener variables y funciones con el mismo nombre que una etiqueta.
void foo ( int number ) { if ( number < 0 ) goto error ; bar ( number ); return ; error : fprintf ( stderr , "¡Número inválido! \n " ); }Aquí, error es la etiqueta. La instrucción goto se puede usar para saltar a una instrucción etiquetada en el código. Después de un salto goto, la ejecución del programa continúa con la instrucción que sigue a la etiqueta.
Etiquetas de interruptor
En una instrucción switch se pueden usar dos tipos de etiquetas. Una etiqueta case consiste en la palabra clave case, seguida de una expresión que se evalúa como una constante entera. Una etiqueta default consiste en la palabra clave default. Las etiquetas case se usan para asociar un valor entero con una instrucción en el código. Cuando se llega a una instrucción switch, la ejecución del programa continúa con la instrucción que sigue a la etiqueta case con el valor que coincide con el valor entre paréntesis de la instrucción switch. Si no hay ninguna etiqueta case, pero hay una etiqueta default, la ejecución del programa continúa con la instrucción que sigue a la etiqueta default. Si no hay ninguna etiqueta default, la ejecución del programa continúa después de la instrucción switch.
switch ( die ) { default : printf ( "inválido \n " ); break ;caso 1 : caso 3 : caso 5 : printf ( "impar \n " ); break ;caso 2 : caso 4 : caso 6 : printf ( "even \n " ); break ; }Dentro de una única instrucción switch , la constante entera asociada a cada etiqueta case debe ser única. Puede haber o no una instrucción default. No existe ninguna restricción en el orden de las etiquetas dentro de una instrucción switch. El requisito de que los valores de las etiquetas case se evalúen como constantes enteras le brinda al compilador más margen para optimizaciones.
Ejemplos
JavaScript
En la sintaxis del lenguaje JavaScript, las declaraciones pueden ir precedidas de la etiqueta:
arriba : //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=3También es posible utilizar breakuna instrucció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 // > barLisp común
En Common Lisp existen dos formas de definir etiquetas. La primera implica el tagbodyoperador especial. A diferencia de 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 tagbodyetiquetas se definen como formas que comienzan con un símbolo; la goforma especial permite transferir el control entre estas etiquetas. [ 5 ]
( let (( iteración NIL )) ( tagbody start ( print 'iniciado ) ( setf iteración 0 ) increase ( print iteración ) ( incf iteración 1 ) ( go check ) check ( if ( >= iteración 10 ) ( go end ) ( go increase )) end ( print 'hecho )))Un segundo método utiliza las macros de lectura y , la primera de las cuales etiqueta el objeto que la 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 su acceso. El marcador de posición n designa un entero decimal sin signo elegido que identifica la etiqueta.#n=#n##n=#n#
( programa #1 = "hola" ( imprimir #1# ))Además, algunos formularios permiten o exigen la declaración de una etiqueta para su posterior referencia, incluyendo el formulario especial blockque prescribe una nomenclatura y la loopmacro que puede identificarse mediante una namedcláusula. Es posible desviarse inmediatamente de un formulario con nombre utilizando el return-fromoperador especial.
( bloque myblock ( bucle para iteración desde 0 hacer ( si ( >= iteración 10 ) ( regresar desde myblock 'hecho ) ( imprimir iteración ))))( bucle llamado myloop para iteración desde 0 hacer ( si ( >= iteración 10 ) ( retornar-desde myloop 'hecho ) ( imprimir iteración )))De manera similar a C, las macros case, ccase, ecase, [ 7 ]typecase , ctypecasey etypecasedefinen sentencias switch. [ 8 ]
( let (( my-value 5 )) ( case my-value ( 1 ( print "uno" )) ( 2 ( print "dos" )) (( 3 4 5 ) ( print "tres cuatro o cinco" )) ( otherwise ( print "cualquier otro valor" ))))( let (( my-value 5 )) ( typecase my-value ( list ( print "una lista" )) ( string ( print "una cadena" )) ( number ( print "un número" )) ( otherwise ( print "cualquier otro tipo" ))))Véase también
Referencias
- ↑ "Sección 6.8.6.1 del estándar C: La instrucción goto" . Archivado del original el 24 de diciembre de 2007. Consultado el 3 de julio de 2008 .
- ↑ "GOTO Statement QuickSCREEN" . Microsoft. 1988. Archivado del original el 25/07/2009 . Consultado el 03/07/2008 .
- ↑ O. Lawlor. "nasm x86 Assembly" . Consultado el 3 de julio de 2008 .
- ↑ "Diferencias entre GW-BASIC y QBasic" . Archivado del 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 .