Goto (programação) – Wikipédia, a enciclopédia livre

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 | editar código-fonte]

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]

(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 

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
Ícone de esboço Este artigo sobre programação de computadores é um esboço. Você pode ajudar a Wikipédia expandindo-o.