Use a instrução goto em C
-
Use a instrução
goto
para implementar um loop em C -
Use a instrução
goto
para sair de loops aninhados em C
Este artigo irá demonstrar vários métodos sobre como usar a instrução goto
em C.
Use a instrução goto
para implementar um loop em C
A palavra-chave goto
é parte da linguagem C e fornece uma construção para fazer um salto incondicional. As instruções if
e switch
são exemplos de saltos condicionais. A construção goto
consiste em duas partes: chamada goto
e nome da etiqueta. Qualquer instrução no código pode ser precedida por um rótulo, que é apenas um identificador seguido por dois pontos. A chamada goto
força a execução do código a saltar para a primeira instrução após a etiqueta. goto
só pode saltar para o rótulo dentro da mesma função e os rótulos são visíveis em toda a função, independentemente da linha em que estão definidos.
No exemplo a seguir, demonstramos um loop simples que compara a variável pontuação
a 1000
em cada bucle. Se pontuação
for menor que igual, ele aumenta e pula para a declaração de comparação novamente. Assim que a instrução if
for verdadeira, outra chamada goto
é invocada e a execução salta para o rótulo EXIT
, levando ao encerramento normal do programa. Este código de exemplo, semelhante a muitos outros, pode ser reimplementado sem instruções goto
, tornando-os relativamente fáceis de ler. Geralmente, tem havido um debate vigoroso sobre a instrução goto
, alguns consideram-na totalmente prejudicial ao código legível e outros ainda vêem alguns casos de uso prático para ela.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern char **environ;
int main(int argc, char *argv[]) {
int score = 1;
START:
if (score > 1000) goto EXIT;
score += 1;
goto START;
EXIT:
printf("score: %d\n", score);
exit(EXIT_SUCCESS);
}
Resultado:
score: 1001
Use a instrução goto
para sair de loops aninhados em C
A instrução goto
pode ser útil para alterar o fluxo de controle se a instrução condicional dentro de um loop for satisfeita, e algum código também deve ser ignorado. O exemplo de código a seguir demonstra um cenário semelhante, em que a matriz de variável de ambiente é acessada e pesquisada. Observe que a instrução if
externa verifica se o ponteiro é válido e só então prossegue para executar o loop. O próprio loop tem outra condicional dentro dele, que verifica a string específica de cada variável de ambiente. Se a string for encontrada, podemos sair do loop, não desperdiçar mais recursos de processamento e pular a seguinte instrução printf
. Isso cria um caso útil para a chamada goto
a ser incluída dentro da instrução if interna que faria o programa saltar para fora da instrução if
externa, continuando a executar o resto do código.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern char **environ;
int main(int argc, char *argv[]) {
if (environ != NULL) {
for (size_t i = 0; environ[i] != NULL; ++i) {
if (strncmp(environ[i], "HOME", 4) == 0) {
puts(environ[i]);
goto END;
}
}
printf("No such variable found!\n");
}
END:
exit(EXIT_SUCCESS);
}
Resultado:
HOME=/home/username
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook