для (; true;) отличается от while (true)? - PullRequest
10 голосов
/ 13 января 2009

Если мое понимание верно, они делают то же самое. Зачем кому-то использовать вариант «для»? Это просто вкус?

Редактировать: Полагаю, я тоже думал о (;;).

Ответы [ 8 ]

40 голосов
/ 13 января 2009
for (;;)

часто используется для предотвращения предупреждения компилятора:

while(1)

или

while(true)

обычно выдает предупреждение компилятора о константе условного выражения (по крайней мере, на самом высоком уровне предупреждения).

8 голосов
/ 13 января 2009

Да, это просто вкус.

6 голосов
/ 13 января 2009

Я никогда не видел for (;true;). Я видел видел for (;;), и единственное отличие, похоже, заключается во вкусе. Я обнаружил, что программисты на C немного предпочитают for (;;) вместо while (1), но это все еще просто предпочтение.

4 голосов
/ 14 января 2009

Не ответ, а примечание: иногда вспоминая, что for (; x;) совпадает с while (x) (другими словами, просто сказать «while», когда я проверяю центральное выражение условного if), помогает мне анализ противно для заявлений ...
Например, становится очевидным, что выражение центра всегда вычисляется в начале первого прохода цикла, что вы можете забыть, но совершенно недвусмысленно, если посмотреть на него в формате while ().

Иногда полезно вспомнить, что

a;
while(b) {
   ...
   c;
}

это почти (см. Комментарии) так же, как

for(a;b;c) {
    ...
}

Я знаю, что это очевидно, но активное понимание этих отношений действительно помогает вам быстро переходить от одной формы к другой, чтобы прояснить запутанный код.

3 голосов
/ 13 января 2009

Некоторые компиляторы (с включенными предупреждениями) будут жаловаться, что while(true) является условным оператором, который никогда не может завершиться ошибкой, тогда как они довольны for (;;).

По этой причине я предпочитаю использовать for (;;) в качестве идиомы бесконечного цикла, но не думаю, что это большое дело.

1 голос
/ 13 января 2009

Это в случае, если они планируют использовать реальный цикл for () позже. Если вы видите для (; true;), это, вероятно, код, предназначенный для отладки.

0 голосов
/ 14 января 2009

Предупреждение компилятора уже обсуждалось, поэтому я подойду к нему с точки зрения семантики. Я использую while (TRUE), а не для (;;), потому что, на мой взгляд, while (TRUE) звучит так, как будто имеет больше смысла, чем для (;;). Я читаю while (TRUE) как «тогда как TRUE всегда TRUE». Лично это улучшение читаемости кода.

Итак, Зевс запрещает мне не документировать свой код (это, НИКОГДА, не случается, конечно), он остается немного более читабельным, чем альтернатива.

Но, в целом, это настолько придирчиво, что в 99% случаев все сводится к личным предпочтениям.

0 голосов
/ 14 января 2009

Оптимизирующий компилятор должен генерировать одинаковую сборку для них обоих - бесконечный цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...