2016-10-01 3 views
6

Ответы на недавний вопрос о for(;;){} циклах (What does a for (;;) loop do), похоже, для меня не отвечали, поэтому я подумал, что попытаюсь немного усовершенствовать этот вопрос. В частности, не зная, что for петли без условностей являются бесконечными циклами, я хотел бы знать, почему они являются бесконечными циклами.Зачем циклы (;;) ведут себя как бесконечные петли?

В заявлении for (;_;){}_ является условным выражением. Мое первое предположение заключалось в том, что пустое выражение может быть оценено до 0 или NULL. Но если вы проверите:

for (;;){} 

- бесконечный цикл, как указывали все.

for (;1;){} 

- бесконечный цикл.

Но ни один из этих органов цикла выполнения на всех:

for (;0;){} 
for (;NULL;){} 

Таким образом, пустое условное выражение, кажется, не оценивают либо 0 или NULL.

Итак, мой вопрос: является ли поведение цикла for (;;){} артефактом того, как C оценивает выражения, или это просто особый случай, определенный реализацией, потому что тело цикла, которое никогда не выполняется, не очень полезно?

ОБНОВЛЕНИЕ: Прочитав комментарии и ответы, я понимаю, что мой вопрос был не так четко сформулирован, как мог бы быть. Я полагаю, что этот вопрос был два раза:

  1. Является ли поведение for(;;){} петель строго результат таким образом, что C оценивает выражения в целом, или это поведение конкретного к тому, что C оценивает for заявления? Оказывается, что вторая из этих альтернатив имеет место, и после дальнейшего размышления это имеет смысл. Обычно отсутствующее выражение вызывает ошибку компилятора. Например, while(){} не будет компилироваться.

  2. Почему это поведение выбрано для for циклов, не имеющих условных выражений? Я изначально предположил, что просто не очень полезно иметь цикл for с телом, который никогда не выполняется. Но мне приходит в голову, что если вы ошибочно оставите условное выражение из своего for, то в соответствии с правилами стандарта ваша программа, скорее всего, столкнется с бесконечным циклом. Это может быть удивительно, но, по крайней мере, вы знаете, где он разбился. Но если альтернативное поведение было правилом, ваша программа пропустила бы тело for, что, возможно, привело бы к каким-то очень неприятным сюрпризам, кто-знает-где. Итак, применяя принцип наименьшего удивления, поведение бесконечного цикла является более желательным. Как отметил @martin, это просто разумное значение по умолчанию для петель for.

Спасибо, всем, за комментарии и ответы, а также за помощь в разъяснении моего вопроса для себя.

+2

Можете ли вы придумать более описательное название вопроса? В идеале название должно помогать другим с тем же вопросом приходить сюда в будущем. –

+0

Справедливый комментарий, @matt - я изменил название. Это более полезно? –

+0

«Мое первое предположение заключалось в том, что пустое выражение может оцениваться как« 0 »или« NULL »- почему? Ни C, ни C++ не имеют такой концепции, как «пустое выражение». Что сразу означает, что пустое пространство вместо условия 'for' требует специальной обработки, которое дается в спецификации' for'. – AnT

ответ

19

И C и C++ гарантируют такое поведение.


[C99: 6.8.5.3/1]: Both clause-1 and expression-3 can be omitted. An omitted expression-2 is replaced by a nonzero constant.


[C++14: 6.5.3/1]: The for statement

for (for-init-statement conditionopt; expressionopt) statement 

is equivalent to

{ 
    for-init-statement 
    while (condition) { 
     statement 
     expression ; 
    } 
} 

[..]

[C++14: 6.5.3/2]: Either or both of the condition and the expression can be omitted. A missing condition makes the implied while clause equivalent to while(true) .

+0

Фантастический ответ, @lightness. Таким образом, поведение определяется в стандартах. –

+0

@ Давид Боулинг: Да. Этот синтаксис специально разрешен и четко определен, как вы это делали. –

+0

спасибо, @lightness. Я думаю, мне может потребоваться свернуться с копией стандарта C99 в эти выходные;) –

0

Условное выражение проверяет , если цикл будет продолжен, да и функция по умолчанию цикла есть .. в цикле. Если бы это был не особый случай с пустым тестовым выражением и продолжение цикла в этом случае, это, следовательно, было бы противоположным случаем (как вы уже заметили) и прервать цикл, который делает весь оператор for менее мощным или даже избыточным.

Используемая здесь техника называется разумным/разумным значением по умолчанию.

+0

Спасибо, что обратились к этой части вопроса. Пожалуйста, ознакомьтесь с моим обновлением исходного вопроса. –

+0

Да. Мне потребовалось немного времени, чтобы понять то, что вы видите там как особенное (и что ваше наблюдение правильное), и я уже знал в то время, что я остановлюсь, потому что не все на этот раз. ;) –

Смежные вопросы