Пов'язана стаття, безумовно, відповідає правилам щодо циклів N + 1/2 Дональда Кнута . Виражено на C / C ++ / Java:
for (;;) {
get next element;
if (at the end) break;
process the element;
}
Це корисно для зчитування рядків або символів з файлу, тестування того, чи ви досягли EOF, а потім його обробки. Я настільки звик бачити, як for(;;)..if(..)break;виглядає візерунок, що для мене це ідіоматично. (Перш ніж я прочитав статтю Кнут, передруковану в книзі " Грамотне програмування" , ця раніше була "wtf?".)
Кнут запропонував ключові слова loop/while/repeat:
loop:
S;
while C:
T;
repeat
Де Sі Tє власниками місць для серії нульових або більше операторів, і Cце булева умова. Якщо б не було Sзаяви, то це був би цикл, а якщо не було, Tто це буде цикл do.
Ця конструкція сама може бути узагальнена, дозволяючи нульові або більше while Cпунктів, що робить її ідеальною для вираження нескінченних циклів, а потім деяких рідкісних умов, які потребують двох перевірок.
У цій же статті Кнут запропонував механізм сигналізації, який був би локальною версією викидів / вилучень винятків (як альтернатива використанню goto).
Для мене? Я хотів би, щоб Java підтримувала оптимізацію зворотного виклику, щоб я міг виражати будь-яку загальну структуру управління за потреби.
Оновлення: я забув зазначити, що багато програмістів на C / C ++ / Java обходять цей шлях, використовуючи вбудоване завдання в умові while:
while ((c = getc(f)) != -1) {
T;
}
Використовуючи терміни з конструкції Кнута, це допустимо , коли Sі Cможуть бути об'єднані в одному вираженні. Деякі люди не хочуть бачити впроваджений призначення вище, в той час як інші ненавидять , щоб побачити breakв for (;;)вище. Але коли Sі Cне можна комбінувати, наприклад, коли Sє кілька заяв, то for (;;)це єдина альтернатива без повторення коду. Інша альтернатива - просто дублювати Sкод:
S;
while (C) {
T;
S;
}
loop/while/repeatАльтернатива Кнуту здається набагато кращою.