L'articolo collegato ha sicuramente ragione su N + 1/2 Loops di Donald Knuth. Espresso in C / C ++ / Java:
for (;;) {
get next element;
if (at the end) break;
process the element;
}
Questo è utile per leggere linee o caratteri da un file, testare se hai raggiunto EOF e poi elaborarlo. Sono così abituato a vedere il pattern for(;;)..if(..)break; che sembra idiomatico per me. (Prima di leggere l'articolo di Knuth, ristampato nel libro Literate Programming , questo era un "wtf?".)
Knuth ha suggerito le parole chiave loop/while/repeat :
loop:
S;
while C:
T;
repeat
Dove S e T sono segnaposto per una serie di zero o più istruzioni e C è una condizione booleana. Se non ci fosse un'istruzione S , allora sarebbe un ciclo while, e se non c'era un'istruzione T , allora sarebbe un ciclo do.
Questo costrutto stesso potrebbe essere generalizzato consentendo zero o più clausole while C , rendendolo perfetto per esprimere loop infiniti e quindi alcune condizioni più rare che avrebbero bisogno di due controlli.
Nello stesso articolo, Knuth ha suggerito un meccanismo di segnalazione che sarebbe una versione locale delle eccezioni di lancio / cattura (in alternativa all'utilizzo di goto).
Per me? Vorrei che Java ottimizzasse l'ottimizzazione della coda di chiamata, in modo che potessi esprimere qualsiasi struttura di controllo generale, se necessario.
Aggiornamento: Ho dimenticato di menzionare che molti programmatori C / C ++ / Java aggirano questo usando un'assegnazione incorporata nella condizione while :
while ((c = getc(f)) != -1) {
T;
}
Usando i termini del costrutto di Knuth, questo è ammissibile quando S e C possono essere combinati in una singola espressione. Alcuni odiano vedere l'assegnazione incorporata sopra, mentre altri odiano vedere il break nella for (;;) sopra. Ma quando S e C non possono essere combinati, come quando S ha più istruzioni, for (;;) è l'unica alternativa senza ripetere il codice. L'altra alternativa è duplicare semplicemente il codice S :
S;
while (C) {
T;
S;
}
L'%% di% di alternativa di Knuth sembra molto meglio.