Пов'язана стаття, безумовно, відповідає правилам щодо циклів 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
Альтернатива Кнуту здається набагато кращою.