El artículo vinculado definitivamente entiende bien sobre N + 1/2 Loops de Donald Knuth. Expresado en C / C ++ / Java:
for (;;) {
get next element;
if (at the end) break;
process the element;
}
Esto es útil para leer líneas o caracteres de un archivo, probar si has alcanzado EOF y luego procesarlo. Estoy tan acostumbrado a ver el patrón for(;;)..if(..)break;
que es idiomático para mí. (Antes de leer el artículo de Knuth, reimpreso en el libro Literate Programming , este solía ser un "wtf?".)
Knuth sugirió las palabras clave loop/while/repeat
:
loop:
S;
while C:
T;
repeat
Donde S
y T
son titulares de una serie de cero o más declaraciones, y C
es una condición booleana. Si no hubiera una declaración S
, sería un bucle while, y si no hubiera una declaración T
, sería un bucle do.
Esta construcción en sí misma podría generalizarse permitiendo cero o más cláusulas while C
, lo que la hace perfecta para expresar bucles infinitos y luego algunas condiciones más raras que necesitarían dos comprobaciones.
En el mismo artículo, Knuth sugirió un mecanismo de señalización que sería una versión local de excepciones de lanzamiento / captura (como alternativa al uso de goto).
para mi? Deseo que Java sea compatible con la optimización de llamadas de cola, para poder expresar cualquier estructura de control general según sea necesario.
Actualización: olvidé mencionar que muchos programadores de C / C ++ / Java solucionan este problema mediante el uso de una asignación incorporada en la condición de while
:
while ((c = getc(f)) != -1) {
T;
}
Usando los términos del constructo de Knuth, esto está permitido cuando S
y C
se pueden combinar en una sola expresión. Algunas personas odian ver la tarea incrustada arriba, mientras que otras odian ver el break
en el for (;;)
anterior. Pero cuando S
y C
no se pueden combinar, como cuando S
tiene múltiples declaraciones, el for (;;)
es la única alternativa sin repetir el código. La otra alternativa es simplemente duplicar el código S
:
S;
while (C) {
T;
S;
}
La alternativa loop/while/repeat
de Knuth parece mucho mejor.