Является ли завершение программы наблюдаемым поведением программы на С++?

Я мог бы также сформулировать это как Что представляет собой наблюдаемое поведение?

Стандарт С++ много говорит о наблюдаемом поведении, но я не уверен, что завершение программы является частью наблюдаемого поведения.

То есть, учитывая такую ​​программу, как:

int main() {
  for(;;) {}
  return 0;
}

является совместимой реализацией, разрешенной для завершения этой программы?

Ответ 1

Да, для компиляции законно генерировать пустую основную часть для вышеуказанного кода (таким образом, заканчивая почти сразу).

С++ 0x FCD говорит, что 6.5 говорит (обратите особое внимание на примечание):

Цикл, который за пределами инструкции for-init в случае оператора for for,
        * не вызывает вызовов в функции ввода-вывода библиотеки и
        * не имеет доступа или не изменяет изменчивые объекты, и
        * не выполняет никаких операций синхронизации (1.10) или атомных операций (статья 29)

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

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


Цитата из проекта была скопирована из этого вопроса и подтверждена против моей копии.

Ответ 2

Является ли завершение программы наблюдаемым поведением программы на С++?

Да, завершение экспирации программы является наблюдаемым поведением, так как программа возвращает код ошибки.

  • 0, когда нет ошибки
  • не 0 значение, если не удалось

Нормальный терминал не показывает эти состояния, поэтому вы не видите его.

Является ли совместимая реализация разрешенной для завершения этой программы?

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

- EDIT -

Ответ на второй вопрос немного ошибочен

Как объяснил Мартин и Мотти в предыдущем ответе:

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