Является ли завершение программы наблюдаемым поведением программы на C ++? - PullRequest
13 голосов
/ 18 ноября 2010

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

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

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

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

является соответствующей реализацией, разрешающей когда-либо завершать эту программу?

Ответы [ 2 ]

6 голосов
/ 18 ноября 2010

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

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

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

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

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


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

2 голосов
/ 18 ноября 2010

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

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

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

Обычный терминал не показывает это состояние, поэтому вы его не «видите».

Соответствуетреализация позволила когда-либо прекратить эту программу?

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

- EDIT--

Ответ на второй вопрос несколько ошибочен

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...