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 S
e T
sono i segnaposti per una serie di zero o più dichiarazioni ed C
è una condizione booleana. Se non ci fosse alcuna S
istruzione, sarebbe un ciclo while e se non ci fosse alcuna T
dichiarazione, sarebbe un ciclo do.
Questo costrutto stesso potrebbe essere generalizzato consentendo zero o più while C
clausole, 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 S
e C
può essere combinato in una singola espressione. Alcune persone odiano vedere l'incarico incorporato sopra, mentre altri odiano vedere break
quanto 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 è semplicemente duplicare il S
codice:
S;
while (C) {
T;
S;
}
L' loop/while/repeat
alternativa di Knuth sembra molto meglio.