CURSO DE C
O Comando goto
O goto é o último comando de controle de fluxo. Ele
pertence a uma classe à parte: a dos comandos de salto incondicional.
O goto realiza um salto para um local especificado. Este local é
determinado por um rótulo. Um rótulo, na linguagem C, é
uma marca no programa. Você dá o nome que quiser a esta marca.
Podemos tentar escrever uma forma geral:
-
nome_do_rótulo:
-
....
goto nome_do_rótulo;
....
Devemos declarar o nome do rótulo na posição para
a qual vamos dar o salto seguido de :. O goto pode saltar
para um rótulo que esteja mais à frente ou para trás
no programa. Uma observação importante é que o rótulo
e o goto devem estar dentro da mesma função.
Como exemplo do uso do goto vamos reescrever o equivalente ao comando
for apresentado na seção equivalente
ao mesmo:
início_do_loop:
if (condição)
{
declaração;
incremento;
goto início_do_loop;
}
O comando goto deve ser utlizado com parcimônia, pois o abuso
no seu uso tende a tornar o código confuso. O goto não
é um comando necessário, mas o seu bom emprego pode
facilitar o entendimento de algumas funções. Há quem
diga que o goto nunca deve ser usado, mas isto não é
verdade. Isto é um extremismo que é em muito devido à
linguagem BASIC que abusa dos gotos e não tem estruturas
ricas como as do C. O comando goto pode tornar um código
muito mais fácil de se entender se ele for bem empregado.
Um caso em que ele pode ser útil é quando temos vários
loops e ifs aninhados e se queira, por algum
motivo, sair destes loops e ifs todos de
uma vez. Neste caso um goto resolve o problema muito mais elegantemente
que vários breaks, sem contar que
os breaks exigiriam muito mais testes. Ou
seja, neste caso o goto é mais elegante e mais rápido.
Mas não abuse.
O exemplo da página anterior pode ser reescrito usando-se o goto:
#include <stdio.h>
main()
{
int opcao;
while (opcao != 5)
{
REFAZ: printf("\n\n Escolha uma opcao entre 1 e 5: ");
scanf("%d", &opcao);
if ((opcao > 5)||(opcao <1)) goto REFAZ; /* Opcao invalida: volta ao rotulo REFAZ */
switch (opcao)
{
case 1:
printf("\n --> Primeira opcao..");
break;
case 2:
printf("\n --> Segunda opcao..");
break;
case 3:
printf("\n --> Terceira opcao..");
break;
case 4:
printf("\n --> Quarta opcao..");
break;
case 5:
printf("\n --> Abandonando..");
break;
}
}
}
AUTO AVALIAÇÃO
Veja como você está.
Escreva um programa que peça três inteiros,
correspondentes a dia , mês e ano. Peça
os números até conseguir valores que estejam na faixa correta
(dias entre 1 e 31, mês entre 1 e 12 e ano entre 1900 e 2100). Verifique
se o mês e o número de dias batem (incluindo verificação
de anos bissextos). Se estiver tudo certo imprima o número que aquele
dia corresponde no ano. Comente seu programa. Faça as identações
corretamente.
Ps: Um ano é bissexto se for divisível por
4 e não for divisível por 100, exceto para os anos divisíveis
por 400, que também são bissextos.
Dúvidas? De uma olhadinha em nosso FAQ