Ответы на недавний вопрос о for(;;){}
циклах (What does a for (;;) loop do), похоже, для меня не отвечали, поэтому я подумал, что попытаюсь немного усовершенствовать этот вопрос. В частности, не зная, что for
петли без условностей являются бесконечными циклами, я хотел бы знать, почему они являются бесконечными циклами.Зачем циклы (;;) ведут себя как бесконечные петли?
В заявлении for (;_;){}
_
является условным выражением. Мое первое предположение заключалось в том, что пустое выражение может быть оценено до 0
или NULL
. Но если вы проверите:
for (;;){}
- бесконечный цикл, как указывали все.
for (;1;){}
- бесконечный цикл.
Но ни один из этих органов цикла выполнения на всех:
for (;0;){}
for (;NULL;){}
Таким образом, пустое условное выражение, кажется, не оценивают либо 0
или NULL
.
Итак, мой вопрос: является ли поведение цикла for (;;){}
артефактом того, как C оценивает выражения, или это просто особый случай, определенный реализацией, потому что тело цикла, которое никогда не выполняется, не очень полезно?
ОБНОВЛЕНИЕ: Прочитав комментарии и ответы, я понимаю, что мой вопрос был не так четко сформулирован, как мог бы быть. Я полагаю, что этот вопрос был два раза:
Является ли поведение
for(;;){}
петель строго результат таким образом, что C оценивает выражения в целом, или это поведение конкретного к тому, что C оцениваетfor
заявления? Оказывается, что вторая из этих альтернатив имеет место, и после дальнейшего размышления это имеет смысл. Обычно отсутствующее выражение вызывает ошибку компилятора. Например,while(){}
не будет компилироваться.Почему это поведение выбрано для
for
циклов, не имеющих условных выражений? Я изначально предположил, что просто не очень полезно иметь циклfor
с телом, который никогда не выполняется. Но мне приходит в голову, что если вы ошибочно оставите условное выражение из своегоfor
, то в соответствии с правилами стандарта ваша программа, скорее всего, столкнется с бесконечным циклом. Это может быть удивительно, но, по крайней мере, вы знаете, где он разбился. Но если альтернативное поведение было правилом, ваша программа пропустила бы телоfor
, что, возможно, привело бы к каким-то очень неприятным сюрпризам, кто-знает-где. Итак, применяя принцип наименьшего удивления, поведение бесконечного цикла является более желательным. Как отметил @martin, это просто разумное значение по умолчанию для петельfor
.
Спасибо, всем, за комментарии и ответы, а также за помощь в разъяснении моего вопроса для себя.
Можете ли вы придумать более описательное название вопроса? В идеале название должно помогать другим с тем же вопросом приходить сюда в будущем. –
Справедливый комментарий, @matt - я изменил название. Это более полезно? –
«Мое первое предположение заключалось в том, что пустое выражение может оцениваться как« 0 »или« NULL »- почему? Ни C, ни C++ не имеют такой концепции, как «пустое выражение». Что сразу означает, что пустое пространство вместо условия 'for' требует специальной обработки, которое дается в спецификации' for'. – AnT