Почему 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 гласит:

  1. Заявление

    for ( clause-1 ; expression-2 ; expression-3 ) заявление

    ведет себя следующим образом: выражение expression-2 является управляющим выражением, которое вычисляется перед каждым выполнением тела цикла. Выражение expression-3 оценивается как пустое выражение после каждого выполнения тела цикла. Если условие-1 является объявлением, область действия любых идентификаторов, которые оно объявляет, является оставшейся частью объявления и всего цикла, включая два других выражения; оно достигается в порядке выполнения до первой оценки управляющего выражения. Если условие-1 является выражением, оно оценивается как пустое выражение перед первой оценкой управляющего выражения. 158)

  2. И предложение-1, и выражение-3 могут быть опущены. Пропущенное выражение-2 заменяется ненулевой константой.

что не так с циклом while. Однако это C11. ANSI C не дает понять это на самом деле. Тем не менее, я предполагаю, что C# основан на том, как C чаще всего работает (s|ed), а не на том, как это указано для работы.

Чтобы предположить, я мог подумать, что цикл for в раннем C не был хорошо определен, поэтому программисты обнаружили, что вы можете написать бесконечный цикл, такой как for (;;), Чтобы быть совместимыми со старыми программами, стандарты никогда не запрещают это. Так что на самом деле нет причин писать так. Я думаю, это просто история.

Другие вопросы по тегам