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.