L'articolo collegato ha decisamente ragione sui N + 1/2 Loops di Donald Knuth . Espresso in C / C ++ / Java:
for (;;) {
get next element;
if (at the end) break;
process the element;
}
Ciò è utile per leggere righe o caratteri da un file, verificare se hai raggiunto EOF e quindi elaborarlo. Sono così abituato a vedere for(;;)..if(..)break;apparire lo schema che è idiomatico per me. (Prima di leggere l'articolo 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 Se Tsono i segnaposti per una serie di zero o più dichiarazioni ed Cè una condizione booleana. Se non ci fosse alcuna Sistruzione, sarebbe un ciclo while e se non ci fosse alcuna Tdichiarazione, sarebbe un ciclo do.
Questo costrutto stesso potrebbe essere generalizzato consentendo zero o più while Cclausole, rendendolo perfetto per esprimere infiniti loop e quindi alcune condizioni più rare che richiederebbero 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 supportasse l'ottimizzazione delle chiamate in coda, in modo da poter esprimere qualsiasi struttura di controllo generale, se necessario.
Aggiornamento: ho dimenticato di menzionare che molti programmatori C / C ++ / Java aggirano questo usando un compito incorporato nelle condizioni di while:
while ((c = getc(f)) != -1) {
T;
}
Usando i termini del costrutto di Knuth, questo è consentito quando Se Cpuò essere combinato in una singola espressione. Alcune persone odiano vedere l'incarico incorporato sopra, mentre altri odiano vedere breakquanto for (;;)sopra. Ma quando Se Cnon possono essere combinati, come quando Sha più istruzioni, for (;;)è l'unica alternativa senza ripetere il codice. L'altra alternativa è semplicemente duplicare il Scodice:
S;
while (C) {
T;
S;
}
L' loop/while/repeatalternativa di Knuth sembra molto meglio.