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

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

BASIC

(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

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 DELGADO, José. Introdução à programação em linguagem assembly. 2013. Acesso em 6Jul2018.
  2. PRADO, Sergio. Você usa goto nos seus códigos em C?. 2011. Acesso em 6Jul2018.
  3. DIJKSTRA, Edsger W. A Case against the GO TO Statement. 1968.
  4. William Slater & Howard Modell. Structured Programming Considered Harmful.
  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. CPAN. Acme::ComeFrom - Parallel Goto-in-reverse. ComeFrom em Perl.
  7. Entrian. goto for Python ("Adds the 'goto' and 'comefrom' keywords to Python.").
  8. KNUTH, Donald. Structured Programming with go to Statements.
  9. An Empirical Study of goto in C Code. 2015.
  10. TRIBBLE, David R. Go To Statement Considered Harmful: A Retrospective. Rev. 1.1, 2005-11-27. Acesso em 9Jul2018.
  11. KERNIGHAN & RITCHIE. The C Programming Language. 2ed. p.57−58.
  12. Linux: Using goto In Kernel Code
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.