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
- ↑ Ver págs. 18, 38 e seguintes de [1] 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