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

Confira também

Instruções de Hiperlink
Palavras-chave