While цикл требует явного условия, для цикла нет, почему?
В С++ вам разрешено иметь пустое условие внутри цикла for, например, как в for (;;)
или for (int x = 0;; ++x)
. Но вы не можете сделать while ()
.
Когда условие отсутствует в цикле for, условие считается true
(поэтому петли цикла навсегда). Почему это не так с циклами while
, то есть, что аргумент, не позволяющий while ()
быть псевдонимом while (true)
?
Ответы
Ответ 1
Предположительно, это побочный эффект того факта, что каждое заданное предложение внутри оператора for является необязательным. Там причины, по которым некоторые for-loops не нуждаются в назначении; есть причины, по которым некоторые другие не нуждаются в состоянии; есть причины, по которым другим людям не понадобится приращение. Требование, чтобы их было минимальное количество, было бы ненужной сложностью.
Ответ 2
Ниже из книги Deep C Secrets:
Ранняя C не имела отдельных операторов для и и && или | и ||. (Получил это?) Вместо этого он использовал понятие (унаследованное от B и BCPL) "контекста истинности": где ожидалось булево значение, после "if" и "while" и т.д. The и and | операторы интерпретировались как && и || есть сейчас; в обычных выражениях использовались побитовые интерпретации. Это получилось неплохо, но было трудно объяснить. (В контексте истинностного значения существовало понятие "операторов верхнего уровня".)
Итак, у вас есть это, while()
установит контекст для значения истинности и не может быть пустым или подразумеваться по той же причине, если() не может быть пустым, механики раннего языка ожидали, что они не будут быть.
Ответ 3
В С++ вам разрешено иметь пустое условие внутри цикла for... какой аргумент не позволяет while()
быть псевдонимом while(true)
?
Прежде всего, С++ (и С# и многие другие языки) - это то, как они предназначены для обратной совместимости с C, поэтому давайте поговорим о C.
Сделайте некоторые утверждения и сделайте вывод.
- Существует хорошая причина, по которой цикл
for
позволяет вам опустить условие.
- То же самое относится к циклу
while
.
- Цикл
while
не позволяет опустить условие; это противоречиво.
- Согласованность выбора дизайна между операторами - важный фактор в дизайне C.
- Поэтому должна быть неочевидная веская причина несогласованности; должна быть веская причина, по которой цикл
while
не соответствует циклу for
.
И теперь возникает вопрос: "Какова эта неочевидная веская причина?"
Но вопрос имеет смысл только в том случае, если цепь логики, описанная выше, правильна, а это не так. Из этих утверждений фактически верно только # 3! Цикл for
в C - плохой дизайн; он излишний, запутанный для новичков, и его лексические соглашения несовместимы с остальной частью языка. Он обеспечивает почти нулевую дополнительную репрезентативную способность к языку через простой цикл while
.
На ваш вопрос нет ответа; правильный ответ скорее полностью отвергает предпосылку вопроса. Цикл for
кажется разумным, потому что это 40-летняя неудача, с которой большинство из нас выросло, поэтому ее причуды являются вторыми природа сейчас; это знакомство, а не хороший дизайн. Если бы мы выросли без цикла for
, мы бы не добавляли его.
Ответ 4
Я думаю, что основное различие между выражениями и утверждениями.
Конечно, в C два строго не различаются, но я бы сказал, что цикл for:
for (statement; expression; statement) {
...
}
Выражение представляет собой логическое выражение, в то время как операторы являются... операторами, которые имеют побочные эффекты. Конечно, C не является полуфункциональным; вы можете поместить побочные эффекты в среднее выражение, но это не идиоматично.
Однако иногда вам не требуется выражение, но операторы в начале и на каждой итерации цикла полезны, поэтому среднее выражение необязательно:
// Infinite counter
int i;
for (i = 0;;i++) {
...
}
Это по определению означает, что выражение считается всегда истинным
С другой стороны, while
и if
могут принимать выражения. Нет ничего очень полезного слева (в отличие от двух полезных утверждений слева), если вы опустите это выражение: никто не напишет
// Idiot coding
if (true) {
...
}
потому что точка оператора if
должна проверить истинность или неизвестность неизвестного!
То же самое с while
. Точка while
заключается в том, чтобы делать что-то снова и снова, пока условие в форме выражения истинно. Это похоже на "повторенный if
". Вот почему
while() {
...
}
не считается логичным и, следовательно, не разрешен.
Ответ 5
В соответствии с Документ:
6.8.5.3 Оператор for
Утверждение for ( clause-1 ; expression-2 ; expression-3 )
оператор ведет себя следующим образом:
- Выражение выражение-2 является управляющим выражением, которое оценивается перед каждым исполнением тела цикла. Выражение выражение-3 оценивается как выражение void после каждого выполнения тела петли. Если предложение-1 является объявлением, объем любого идентификаторы, которые он объявляет, являются остальной частью декларации и полный цикл, включая два других выражения; это достигается в порядок исполнения до первой оценки контрольного выражение. Если предложение-1 является выражением, оно оценивается как пустота выражение перед первой оценкой контрольного expression.158)
- Оба предложения-1 и выражение-3 могут быть опущены. Пропущено выражение-2 заменяется ненулевой константой.
Итак, в случае цикла for
условие будет заменено ненулевой константой и не будет такой реализации для цикла while
.
Ответ 6
Разница между логическими операторами, используемыми в циклах while() и for (;;), такова:
-
в случае, если оператор определяет условие выхода из цикла
-
в случае while() оператор определяет условие выполнения цикла
Предполагая, что вы видите, что для входа в цикл вам требуется хотя бы условие выполнения, а не условие выхода.