Usa l'istruzione goto in C

Jinku Hu 12 ottobre 2023
  1. Usa l’istruzione goto per implementare un bucle in C
  2. Usa l’istruzione goto per uscire dai loop annidati in C
Usa l'istruzione goto in C

Questo articolo mostrerà diversi metodi su come utilizzare l’istruzione goto in C.

Usa l’istruzione goto per implementare un bucle in C

La parola chiave goto fa parte del linguaggio C e fornisce un costrutto per eseguire un salto incondizionato. Le istruzioni if e switch sono esempi di salti condizionali. Il costrutto goto consiste di due parti: chiamata goto e nome dell’etichetta. Qualsiasi istruzione nel codice può essere preceduta da un’etichetta, che è solo un identificatore seguito da due punti. La chiamata goto forza l’esecuzione del codice a saltare alla prima istruzione dopo l’etichetta. goto può saltare solo all’etichetta all’interno della stessa funzione e le etichette sono visibili nell’intera funzione indipendentemente dalla linea in cui sono definite.

Nell’esempio seguente, dimostriamo un semplice bucle che confronta la variabile score con 1000 su ogni bucle. Se score è minore di uguale, incrementa e salta di nuovo all’istruzione di confronto. Una volta che l’istruzione if è vera, viene invocata un’altra chiamata goto e l’esecuzione salta all’etichetta EXIT, portando alla normale chiusura del programma. Questo codice di esempio, simile a molti altri, può essere reimplementato senza istruzioni goto, rendendoli relativamente facili da leggere. In generale, c’è stato un acceso dibattito sulla dichiarazione goto, alcuni la considerano assolutamente dannosa per il codice leggibile, e altri ancora vedono alcuni casi d’uso pratici per essa.

#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);
}

Produzione:

score: 1001

Usa l’istruzione goto per uscire dai loop annidati in C

L’istruzione goto può essere utile per modificare il flusso di controllo se l’istruzione condizionale all’interno di un bucle è soddisfatta e anche del codice dovrebbe essere saltato. Nell’esempio di codice riportato di seguito viene illustrato uno scenario simile in cui si accede alla matrice di variabili di ambiente e si esegue la ricerca. Si noti che l’istruzione if esterna controlla se il puntatore è valido e solo allora procede all’esecuzione del bucle. Il bucle stesso ha un altro condizionale al suo interno, che controlla la stringa specifica di ciascuna variabile di ambiente. Se la stringa viene trovata, possiamo uscire dal bucle, non sprecare altre risorse di elaborazione e saltare la seguente istruzione printf. Questo crea un caso utile per la chiamata goto da includere all’interno dell’istruzione if interna che farebbe saltare il programma fuori dall’istruzione if esterna, continuando a eseguire il resto del codice.

#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);
}

Produzione:

HOME=/home/username
Autore: 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