Instrucción goto
Transfiere el control incondicionalmente.
Se usa cunado de otro modo es imposible transferir el control a la ubicación deseada usando otras instrucciones.
Contenido |
[editar]Sintaxis
atrib(opcional)goto etiqueta; | |||||||||
[editar]Explicación
La instrucción goto transfiere el control a la localización especificada por la etiqueta. La instrucción goto debe estar en la misma función que la etiqueta a la que se refiere, puede aparecer antes o después de la etiqueta.
Si al transferir el control se sale del ámbito de cualquier variable automática (por ejemplo saltando hacia atrás a un punto anterior a la declaración de dichas variables o saltando hacia adelante fuera de una instrucción compuesta donde está el ámbito de las variables), se llama a los destructores para todas las variables cuyo ámbito se abandona, en el orden contrario al orden en que fueron creadas.
La instrucción goto
no puede transferir el control hacia dentro de un bloque try o una clausula catch, pero lo puede transferir hacía fuera de un bloque try o una clausula catch (se siguen las reglas anteriores con respecto a las variables automáticas en el ámbito)
Si la transferencia de control entra en el ámbito de cualquier variable automática (por ejemplo, saltando hacia adelante sobre una instrucción de declaración), el programa está mal formado (no se puede compilar), a menos que todas las variables a cuyo ámbito se entra tengan
(Nota: las mismas reglas se aplican a todas las formas de transferencia de control)
[editar]Palabras clave
[editar]Notas
En el lenguaje de programación C, la instrucción goto
tiene menos restricciones y puede entrar en el ámbito de cualquier variable que no sea un array de longitud variable o un puntero modificado de forma variable.
[editar]Ejemplo
#include <iostream> struct Object {// destructor no trivial ~Object(){std::cout<<"d";}}; struct Trivial {double d1;double d2;};// constructor y destructor triviales int main(){int a =10; // bucle usando goto etiqueta: Object obj;std::cout<< a <<" "; a = a -2; if(a !=0){goto etiqueta;// salta fuera del ámbito de obj, llamada al destructor de obj}std::cout<<'\n'; // se puede usar goto para salir fácilmente de un bucle multinivelfor(int x =0; x <3; x++){for(int y =0; y <3; y++){std::cout<<"("<< x <<";"<< y <<") "<<'\n';if(x + y >=3){goto finbucle;}}} finbucle:std::cout<<'\n'; goto etiqueta2;// salta dentro del ámbito de n y tint n;// sin inicializador Trivial t;// constructor y destructor triviales, sin inicializador// int x = 1; // error: tiene incializador// Object obj2; // error: destructor no trivial etiqueta2: { Object obj3;goto etiqueta3;// salta hacia adelante, fuera del ámbito de obj3} etiqueta3:std::cout<<'\n';}
Salida:
10 d8 d6 d4 d2 (0;0) (0;1) (0;2) (1;0) (1;1) (1;2) d d
[editar]Otras lecturas
El popular ensayo de Edsger W. Dijkstra essay, “Goto Considered Harmful”, presenta un estudio de muchos problemas sutiles que puede crear el uso sin cuidado de esta palabra clave.
[editar]Véase también
Documentación de C para goto |