Является ли (пустой) бесконечный цикл неопределенным поведением в C?

Является бесконечным циклом, подобным for (;;); неопределенное поведение в C? (Это для C ++ , но я не знаю о C.)

Нет, поведение оператора for (;;) хорошо определено в C.

N1570 , который по существу идентичен официальному стандарту ISO C 2011 года, гласит в пункте 6.8.5 раздела 6:

Оператор итерации, контрольное выражение которого не является постоянным выражением, которое не выполняет операций ввода-вывода, не получает доступ к неустойчивым объектам и не выполняет никаких операций синхронизации или атома в своем теле, контролируя выражение или (в случае оператора for ) его выражение-3 , можно предположить, что реализация завершается.

с двумя сносками:

Исключенное управляющее выражение заменяется ненулевой константой, которая является постоянным выражением.

Это предназначено для того, чтобы разрешить преобразования компилятора, такие как удаление пустых петель даже тогда, когда завершение не может быть доказано.

В первой сноске ясно, что for (;;) трактуется так, как если бы оно имело постоянное контролирующее выражение.

Точка правила состоит в том, чтобы разрешить оптимизацию, когда компилятор не может доказать, что цикл завершается. Но если контрольное выражение является постоянным, компилятор может тривиально доказать, что цикл выполняется или не завершается, поэтому дополнительное разрешение не требуется.

Обоснование этого вопроса, имеющее отношение к C ++, не имеет отношения к C. В разделе 5.1.2.3p6 указаны пределы для оптимизации, и один из них:

При завершении программы все данные, записанные в файлы, должны быть идентичны результату выполнения программы в соответствии с абстрактной семантикой.

Теперь возникает вопрос: «Какие данные выполнялись в соответствии с абстрактной семантикой?». Предполагая, что сигнал прерывает цикл, программа может очень сильно прекратиться. Тем не менее, абстрактная семантика не создавала бы выходных данных до того, как был поднят этот сигнал. Во всяком случае, компилятор может оптимизировать puts("Hello"); далеко.