Я думаю, что основное различие между выражениями и заявлениями.
Конечно, в C два не строго различаются, но я бы сказал, что для петли:
for (statement; expression; statement) {
...
}
Выражение представляет собой логическое выражение, в то время как заявления ... заявления, которые имеют сторону последствия. Конечно, C не является полуфункциональным; вы можете поместить побочные эффекты в среднее выражение, но это не идиоматично.
Но иногда вы не хотите выражения, но заявления в начале и в каждой итерации цикла полезно, так что среднее выражение не является обязательным:
// Infinite counter
int i;
for (i = 0;;i++) {
...
}
Это по определению означает, что выражение считается всегда верно
с другой стороны, while
и if
может только принимает выражение. Там нет ничего очень полезно слева (в отличие от двух полезных утверждений слева), если опустить это выражение: никто не будет писать
// Idiot coding
if (true) {
...
}
потому что точка из if
утверждения проверить, является ли какая-то неизвестная правда или нет!
То же самое с while
. Точка while
должна делать что-то снова и снова, пока условие в виде выражения истинно. Это похоже на «итерированный if
». Вот почему
while() {
...
}
не считается логическим и, следовательно, не допускается.
Ответ скорее всего 2 раза: 1) быть обратно совместимым с C99 и 2), потому что комитет по стандартам сказал это. Может быть какая-то грамматическая причина, почему 'while()' может не работать, но теоретически это могло быть исправлено, если они действительно этого хотели. –
@ZacHowland 1) Тогда вопрос в том, почему это имеет место в C99;) – leemes
@leemes - Потому что комитет по стандартам C90 сказал так;) –