Goto (programação)

O comando goto (do inglês go to, em português ir para) é uma estrutura de controle para salto de instruções.

Sua sintaxe é, em geral: goto destino , onde destino pode ser um label (rótulo ou nome de um endereço) ou um número, que representa um determinado endereço. As instruções passam a ser executadas no endereço apontado por destino.

Em assembly de x86, o controle de fluxo é baseado em saltos (instruções como JMP, JZ, JNZ), que são comparáveis ao goto das linguagens de programação de alto nível.[1] [2]

Situações de uso editar

Críticas de Dijkstra à legibilidade de programas escritos com uso extensivo de goto [3] geraram, entre diversas reações, a humorística instrução ComeFrom (vir de).[4] [5] [6] [7]

Donald Knuth analisou e avaliou quão apropriado é (ou não) o uso de goto em diversas situações.[8] Há também um estudo sobre o uso dessa instrução em projetos de software escritos em C.[9]

Uma retrospectiva sobre o assunto é apresentada por David Tribble, com diversos exemplos de código (C, C++, Assembly, Java) com e sem uso de goto.[10]

Exemplos editar

BASIC editar

(não confundir com Visual Basic ou outros Basic)

Uso de goto para criar uma estrutura de repetição (também chamada laço, ciclo ou loop):

10 PRINT "Quanto é 7 - 7?"
20 INPUT A
30 IF A = 0 THEN GOTO 60
40 PRINT "Errado... Tente outra vez!"
50 GOTO 20
60 PRINT "Certo! Parabéns!"
70 END

C editar

Uma aplicação citada por Brian Kernighan & Dennis Ritchie[11] é para escapar de laços muito aninhados:

for (i=0; i<P; i++) {
    for (j=0; j<Q; j++) {
        for (k=0; k<R; k++) {
            ...
            if ( condicao )
                goto CONTINUACAO;
            ...
        }
    }
}
CONTINUACAO:
...

Em linguagens sem suporte a tratamento de exceções (como é o caso de C), goto pode ser usado para desfazer ações em ordem reversa, em caso de erro:[12]

int realizaProcedimentos(void)
{
    int estado;

    estado = fazPrimeiraEtapa();
    if (estado==ERRO)
goto RESTAURA1;

    estado = fazSegundaEtapa();
    if (estado==ERRO)
goto RESTAURA2;

    estado = fazTerceiraEtapa();
    if (estado==ERRO)
goto RESTAURA3;

    return (SUCESSO);

RESTAURA3:
    desfazTerceiraEtapa();
RESTAURA2:
    desfazSegundaEtapa();
RESTAURA1:
    desfazPrimeiraEtapa();

    return (ERRO);
}


Referências

  1. Ver págs. 18, 38 e seguintes de [1] DELGADO, José. Introdução à programação em linguagem assembly. 2013. Acesso em 6Jul2018.
  2. [2] PRADO, Sergio. Você usa goto nos seus códigos em C?. 2011. Acesso em 6Jul2018.
  3. [3] DIJKSTRA, Edsger W. A Case against the GO TO Statement. 1968.
  4. [4] William Slater & Howard Modell. Structured Programming Considered Harmful.
  5. [5] R. Lawrence Clark. We don't know where to GOTO if we don't know where we've COME FROM. This linguistic innovation lives up to all expectations. From DATAMATION, December, 1973.
  6. [6] CPAN. Acme::ComeFrom - Parallel Goto-in-reverse. ComeFrom em Perl.
  7. [7] Entrian. goto for Python ("Adds the 'goto' and 'comefrom' keywords to Python.").
  8. [8] KNUTH, Donald. Structured Programming with go to Statements.
  9. [9] An Empirical Study of goto in C Code. 2015.
  10. [10] TRIBBLE, David R. Go To Statement Considered Harmful: A Retrospective. Rev. 1.1, 2005-11-27. Acesso em 9Jul2018.
  11. [11]KERNIGHAN & RITCHIE. The C Programming Language. 2ed. p.57−58.
  12. [12] Linux: Using goto In Kernel Code
  Este artigo sobre programação de computadores é um esboço. Você pode ajudar a Wikipédia expandindo-o.