Что происходит, когда вы устанавливаете точку с запятой после состояния цикла while?
Я встречал такую ситуацию несколько раз:
while (true) {
while (age == 5); //What does this semi-colon indicate?
//Code
//Code
//Code
}
while(true)
указывает на то, что это бесконечный цикл, но мне трудно понять, что полуколона после выполнения условия while
выполняется, не эквивалентно ли этому?:
while (age == 5) { }
//Code
//Code
Другими словами, означает ли это, что цикл while
бесполезен, поскольку он никогда не входит в блок?
Ответы
Ответ 1
while (age == 5); // empty statement
эквивалентно
while (age == 5) { } // empty block
Обновление: Даже если тела нет, это не означает, что цикл завершается. Вместо этого он будет просто повторять цикл над условным (который может иметь или полагаться на побочные эффекты), пока он не будет удовлетворен. Вот эквивалентная форма с goto
:
loop:
if (age == 5)
goto loop;
Эта конструкция иногда используется как цикл занятости, ожидая изменения флага в потоковом коде. (Точное использование и валидность варьируется в зависимости от языка, алгоритма и среды исполнения.)
Я нахожу использование ;
для "empty block" пустой инструкции для сомнительной конструкции для использования из-за таких проблем:
while (age == 5); {
Console.WriteLine("I hate debugging");
}
(Я видел эту ошибку несколько раз раньше, когда был добавлен новый код.)
Счастливое кодирование.
Ответ 2
while (age == 5);
попадает в бесконечный цикл. В c ;
- нулевой ограничитель. Компилятор предполагает, что в вышеуказанном цикле имеется только один оператор, который ;
, который заставляет цикл повторяться бесконечно.
Ответ 3
оператор, состоящий только из
;
- это нулевой оператор. Это то же самое, что и блок (также называемый составной оператор), в котором нет ничего внутри
{
}
Оба они не выполняют никаких операций.
Ответ 4
Если мы помещаем ;
в любом месте, это означает null
statement (оператор, который ничего не делает).
Когда мы пишем
while(true);
Это означает, что цикл while представляет собой инструкцию, которая ничего не делает. Он похож на
while(true)
i++;
Здесь инструкция не null
, но в предыдущем случае оператор был null
.