Бесконечные петли - верх или низ?
В духе таких вопросов, как Тесты ваших петель сверху или снизу?:
Какой стиль вы используете для бесконечного цикла и почему?
- while (true) {}
- do {} while (true);
- за (;;) { }
- ярлык: ... перейти к ярлыку;
19 ответов
while(true) {}
Кажется, что он наиболее эффективно передает смысл цикла.
for (;;)
{
/* No warnings are generated about constant value in the loop conditional
plus it is easy to change when you realize you do need limits */
}
Мне нравится использовать подход for(;;), потому что компилятор MSVC++ жалуется на подход цикла while:
void main()
{
while(1) // test.cpp(5) : warning C4127: conditional expression is constant
{
}
for(;;)
{
}
}
Я предпочитаю while(1)
или же while(true)
- это самое ясное. do { } while(true)
кажется ненужным запутыванием. Точно так же, for(;;)
может сбить с толку людей, которые никогда не видели этого раньше, тогда как while(true)
очень интуитивно понятно И нет абсолютно никаких причин делать label: ... goto label;
Смущает.
Я обычно использую for(;;) { }
о котором я всегда думаю как о "навсегда".
Некоторые языки предлагают repeat { }
конструкция, которая будет изначально цикл навсегда. Я нахожу for(;;) { }
построить визуально наиболее похожим на это, потому что он так сильно отличается от нормального for()
построить. Это важный атрибут для бесконечного цикла, который while(1) { }
на самом деле не имеет.
Бесконечный хвост-рекурсия;)
Это несколько зависит от компилятора...
Я использую for (;;)
на языках C-стиля и while true
на языках, которые не поддерживают эту конструкцию.
Я узнал for (;;)
метод в K&R, и он всегда чувствовал себя идиоматическим Си для меня.
Пусть пламя начнется...
Если цикл является истинным бесконечным циклом (т. Е. Нет условия прерывания - только внешнее событие может прервать выполнение потока / процесса), тогда я на самом деле предпочитаю метку и goto
, Вот почему:
Во-первых, использование while
, for
, а также do ... while
, все подразумевают, что цикл может завершиться. Даже если условие завершения никогда не достижимо, синтаксический смысл этих конструкций состоит в том, что существует некоторое условие завершения.
Во-вторых, использование конструкции цикла добавляет дополнительный уровень отступа. Я ненавижу отступы, в которых нет необходимости. Это пустая трата ценной недвижимости.
В-третьих, единственным истинным бесконечным циклом является тот, который безоговорочно возвращается назад к началу цикла. Только goto
точно соответствует этой цели.
Правда в том, что меня это не особо волнует. Все они выполняют свою работу, и в любом случае большинство из них приведут к одинаковым инструкциям по сборке. Тем не менее, сгенерированная сборка, по всей вероятности, будет безусловным переходом (если вы оптимизатор, чёрт побери), который напрямую связывается с какой конструкцией C, дети? Это верно... твой старый друг goto
,
Оффтоп: если вы думаете о том, что пытаетесь выразить, вам обычно не понадобится бесконечный цикл.
При написании кода для себя я использую для (;;). Другие люди, как правило, сбиты с толку его синтаксисом, и поэтому для кода, который другие люди должны видеть / использовать, я использую while(true).
Бесконечные циклы - плохая идея, но на практике это не всегда так.
Я предпочитаю while(1) { }, но убедитесь, что что-то внутри цикла может вызвать его разрыв.
Я обычно использую while() {}
но, узнав, что for(;;) {}
не какой-то сумасшедший неверный синтаксис, я обязательно буду использовать более уникальную опцию.
Видите ли, дифференцирует бесконечные циклы от реальных условных выражений.
Я сейчас предпочитаюfor (;;)
"идиома, потому что она, кажется, больше" торчит ". Я использовал"while (true)
"идиома, потому что я думал, что это выражало намерение лучше, но я переключился, потому что я думаю, что"for (;;)
"Идиома достаточно известна, чтобы адекватно выражать намерения, и я считаю, что лучше быть более заметным.
Что-то вроде того, как Страуструп целенаправленно делал новые приведения в C++ безобразными - так что они выпали.