Instrução goto (C++)
A instrução goto
transfere o controle incondicionalmente para a instrução rotulada pelo identificador especificado.
Sintaxe
goto identifier;
Comentários
A instrução rotulada designada por identifier
deve estar na função atual. Todos os nomes de identifier
são membros de um namespace interno e, portanto, não interferem em outros identificadores.
As etiquetas de instrução são relevantes apenas para uma instrução goto
; caso contrário, são ignoradas. Os rótulos não podem ser redeclarados.
Uma instrução goto
não tem permissão para transferir o controle para um local que ignora a inicialização de qualquer variável que esteja no escopo nesse local. O seguinte exemplo gera C2362:
int goto_fn(bool b)
{
if (!b)
{
goto exit; // C2362
}
else
{ /*...*/ }
int error_code = 42;
exit:
return error_code;
}
É um bom estilo de programação usar as instruções break
, continue
e return
em vez da instrução goto
sempre que possível. No entanto, como a instrução break
sai apenas de um nível de um loop, você pode ter que usar uma instrução goto
para encerrar um loop profundamente aninhado.
Para mais informações sobre rótulos e a instrução goto
, confira Instruções rotuladas.
Exemplo
Neste exemplo, uma instrução goto
transfere o controle para o ponto rotulado stop
quando o valor de i
é igual a 3.
// goto_statement.cpp
#include <stdio.h>
int main()
{
int i, j;
for ( i = 0; i < 10; i++ )
{
printf_s( "Outer loop executing. i = %d\n", i );
for ( j = 0; j < 2; j++ )
{
printf_s( " Inner loop executing. j = %d\n", j );
if ( i == 3 )
goto stop;
}
}
// This message does not print:
printf_s( "Loop exited. i = %d\n", i );
stop:
printf_s( "Jumped to stop. i = %d\n", i );
}
Outer loop executing. i = 0
Inner loop executing. j = 0
Inner loop executing. j = 1
Outer loop executing. i = 1
Inner loop executing. j = 0
Inner loop executing. j = 1
Outer loop executing. i = 2
Inner loop executing. j = 0
Inner loop executing. j = 1
Outer loop executing. i = 3
Inner loop executing. j = 0
Jumped to stop. i = 3