Use a instrução goto em C

Jinku Hu 12 outubro 2023
  1. Use a instrução goto para implementar um loop em C
  2. Use a instrução goto para sair de loops aninhados em C
Use a instrução goto 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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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