Почему C# также не допускает пустых условий в циклах while?
Редактировать: я изменил большую часть своего вопроса, потому что это было слишком долго, и хотя мой вопрос - запрос фактов, он считался основанным на мнении. Сказав это, пожалуйста, прочитайте комментарии, где я пытаюсь объяснить, почему закрытие этого вопроса было неправильным ИМХО.
Также: я хотел бы извиниться за мой первоначальный вопрос, я не являюсь носителем английского языка, и я не знал, что слово [вслепую] имело такой отрицательный тон. Я на самом деле использовал это слово в других вопросах.
Фон:
Рассмотрим следующий фрагмент кода C#:
for(; /*empty condition*/ ;)
{
//Infinite loop
}
Это среди других методов считается хорошей практикой, чтобы сделать бесконечный цикл. Но когда мы попробуем аналогичный подход с while loop
это никогда не будет компилироваться:
while(/*empty condition*/)
{
//Compiler error
}
Сначала я подумал, что это какая-то ошибка в моем компиляторе, но потом я прочитал C# language specification
, Я обнаружил, что это был дизайн. Зачем? Потому что C# основан на C, а C ведет себя так.
Итак, теперь вопрос, почему C ведет себя так? Кто-то уже задавал этот вопрос в Stackru. Ответ был довольно неудовлетворительным и сводился к этому:
Он ведет себя так, потому что это описано в спецификации языка Си.
Этот ответ напомнил мне о многих дискуссиях, которые у меня были с родителями, когда я был ребенком: "Почему я должен убирать свою комнату?" - "Потому что мы так говорим"., Дальнейшие ответы предполагают (т.е. не было добавлено ни источников, ни аргументов), что while()
"взломать" и что "с помощью for(;;)
имеет больше смысла ".
Мое исследование
Редактировать: удалено, потому что считалось долго. В основном это была попытка выяснить, почему у C такая конструкция.
Мой вопрос:
После всех моих исследований я пришел к выводу, что while loop
Неспособность принимать пустые выражения нелогична, если the for loop
Можно.
Но если это правда, то почему команда разработчиков языка C# скопировала эту версию?
Вы: "C# основан на C, и зачем вам изобретать велосипед?"
Правда, но зачем принимать такие же нелогичные решения? Если бы твой дед прыгнул с моста, ты бы тоже это сделал, только потому, что ты на нем основан? И не является ли создание нового языка - основанного на старом - идеальной ситуацией, чтобы избежать / исправить нелогичные ошибки старого языка?
Итак, чтобы повторить мой вопрос:
- Почему команда разработчиков C# скопировала это поведение?
2 ответа
После всех моих исследований я могу только сделать вывод, что неспособность цикла while принимать пустые выражения нелогична.
Очень надуманный вывод. ИМХО это for(;;)
цикл, который является нелогичным (и не только в этом отношении).
Ясно, что while() { ... }
было бы возможно, но в чем именно заслуга?
В качестве стиля я бы предпочел for(;true;)
над for(;;)
, у него меньше шансов быть неправильно истолкованным.
Возможность написать цикл "навсегда" - это небольшая проблема, гораздо важнее избежать опечаток.
Единственное, что имеет значение, это удобочитаемость while()
,
И что должно произойти в этом заявлении?
if() Foo();
Спецификация C11 гласит:
Заявление
for ( clause-1 ; expression-2 ; expression-3 )
заявлениеведет себя следующим образом: выражение expression-2 является управляющим выражением, которое вычисляется перед каждым выполнением тела цикла. Выражение expression-3 оценивается как пустое выражение после каждого выполнения тела цикла. Если условие-1 является объявлением, область действия любых идентификаторов, которые оно объявляет, является оставшейся частью объявления и всего цикла, включая два других выражения; оно достигается в порядке выполнения до первой оценки управляющего выражения. Если условие-1 является выражением, оно оценивается как пустое выражение перед первой оценкой управляющего выражения. 158)
И предложение-1, и выражение-3 могут быть опущены. Пропущенное выражение-2 заменяется ненулевой константой.
что не так с циклом while. Однако это C11. ANSI C не дает понять это на самом деле. Тем не менее, я предполагаю, что C# основан на том, как C чаще всего работает (s|ed), а не на том, как это указано для работы.
Чтобы предположить, я мог подумать, что цикл for в раннем C не был хорошо определен, поэтому программисты обнаружили, что вы можете написать бесконечный цикл, такой как for (;;)
, Чтобы быть совместимыми со старыми программами, стандарты никогда не запрещают это. Так что на самом деле нет причин писать так. Я думаю, это просто история.