Supposto che la variabile i
sia inizializzata a 0 all'inizio, il tuo codice è solo una versione offuscata di
while(1)
{
x_get_inputs();
x_react();
x_set_outputs();
}
(e mi ci sono voluti alcuni minuti per capire che il tuo codice ha davvero questa semantica e nessun% emulato nascostogoto
). Questo è più breve e mostra esplicitamente cosa sta succedendo qui. La tua versione originale è difficile da capire, difficile da mantenere, e immagino che non ti porti nemmeno alcun vantaggio a livello di assemblaggio o di prestazioni. Quindi, per questo caso, consiglierei contro di esso.
D'altro canto, quando questo viene realmente chiamato in un contesto in cui i
può avere un valore arbitrario da 0 a 2, il costrutto ha più senso (anche se penso che ci dovrebbe essere almeno una guardia di sicurezza intorno a questo impedendomi di entrare in > 2, che finirebbe in un ciclo infinito senza chiamare più nessuna delle tre funzioni.
Tuttavia, IMHO il costrutto è ancora eccessivamente complicato anche per quel caso. Ecco una versione più breve, che fa lo stesso:
while (1)
{
switch (i)
{
case 0:
x_get_inputs();
case 1:
x_react();
case 2:
x_set_outputs();
default:
i = 0;
}
}
Puoi renderlo ancora più pulito sostituendo il numero intero i
con un enum (con nomi ben scelti) e cambia il nome di i
in qualcosa come "firstOperation". Inoltre, si dovrebbe aggiungere una sorta di salvaguardia per il caso di i > 2 pure. Lascio questo come "un esercizio per il lettore".