C Goto

Da Andreabont's Wiki.

Il C supporta il costrutto GOTO, permettendo di dichiarare delle etichette in un punto del codice e poi saltarci attraverso la parola chiave goto.

Codice

puts("Inizio");
goto medio;

fine:
puts("Fine");
return 0;

medio:
puts("Medio");
goto fine;

Output atteso:

Inizio
Medio
Fine

Utilizzi

Il GOTO non è tra le pratiche di buona programmazione, anzi, nella maggior parte dei casi è considerato un errore. Ma esistono dei casi particolari in cui l'utilizzo di questa espressione è ancora accettato per motivi di prestazioni e leggibilità.

Uscita da clicli nidificati

Se si è in un ciclo è possibile usare la parola chiave break per uscire da esso, ma nel caso in cui si è in un ciclo nidificato in un altro non è possibile uscire da entrambi in contemporanea, a meno di non usare delle variabili come flag per determinare la condizione del ciclo esterno. Una soluzione più veloce è l'utilizzo del GOTO ad una label alla fine del ciclo.

for(int x = 0; x <= 10; x++) {
   for(int y = 0; y <= 10; y++) {
      if(condizione) {
         goto exit_loop;
      }
   }
}
exit_loop: ...

Finalizzazione

Se si è in una serie di controlli, dove il primo che fallisce deve causare una finalizzazione ed una uscita immediata, una soluzione classica causa molta duplicazione del codice, per minimizzarla è possibile usare il GOTO per centralizzare in un unico punto la finalizzazione.

// Codice da controllare
if(error) {
    goto finalize;
}

// Codice da controllare
if(error) {
    goto finalize;
}

[...]

finalize: 
// Codice che finalizza
return;