Подтвердить что ты не робот

While цикл требует явного условия, для цикла нет, почему?

В С++ вам разрешено иметь пустое условие внутри цикла for, например, как в for (;;) или for (int x = 0;; ++x). Но вы не можете сделать while ().

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

4b9b3361

Ответ 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() оператор определяет условие выполнения цикла

Предполагая, что вы видите, что для входа в цикл вам требуется хотя бы условие выполнения, а не условие выхода.