Il fattore generale differenziazione tra i seguenti cicli:
while (condition) {action}
do {action} while (condition)
è che il primo è utilizzato per cicli che accadono nullo o più volte mentre il secondo è di cicli che accadono uno o più tempo .
In altre parole, la condizione per while
viene verificata all'inizio del ciclo e per do while
, viene controllata alla fine.
Spesso vedrete codice in cui gli sviluppatori non sembrano sapere su do-while
in che faranno scrivono:
result = doSomething();
while (result == NOT_FINISHED) {
result = doSomething();
}
che potrebbe essere meglio scritto come:
do {
result = doSomething();
} while (result == NOT_FINISHED);
Tuttavia, nel caso specifico in cui la condizione è sempre true
, non ha molta importanza. I seguenti cicli sono sostanzialmente equivalenti (utilizzando 1
per il vero e proprio caso):
for (;;) { doSomething(); }
for (;;doSomething());
while (1) { doSomething(); }
do { doSomething(); } while (1);
while (doSomething(),1);
BADPAX: doSomething(); goto BADPAX;
La prima for
ciclo è probabilmente il modo canonico di fare un ciclo infinito, approfittando del fatto che, se si omette la condizione di continuazione per il ciclo, presuppone che sia sempre vero.
Il secondo ciclo for
sposta semplicemente il corpo del loop nella parte di iterazione dell'istruzione for
.
Il primo while
viene talvolta visto anche in natura, il do-while
probabilmente meno. L'unica differenza qui è che i loop precedenti controllano per sempre il loop in alto, il secondo loop per sempre controlla il fondo del loop.
Il while
ciclo finale sta usando l'operatore virgola C in un modo che probabilmente non dovrebbe :-)
Questo ultimo è molto raro al giorno d'oggi, ma è probabilmente quello che tutti ottimizzano fino al a livello di codice macchina.
Non ho mai visto un 'do while (true)'. È un ciclo infinito, ma il modo idiomatico (e chiaro) di scriverne uno se per (;;) '. –