Usa l'istruzione goto in C
-
Usa l’istruzione
goto
per implementare un bucle in C -
Usa l’istruzione
goto
per uscire dai loop annidati 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
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