Что происходит, когда вы устанавливаете точку с запятой после состояния цикла 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.