Ответ 1
В С++, а в C99 и C11 это специальное правило языка, если поток управления достигает конца функции main
, то функция impliclty возвращает 0
.
Почему нет необходимости включать оператор return при использовании int main() в некоторых компиляторах для С++? Как насчет Turbo С++?
В С++, а в C99 и C11 это специальное правило языка, если поток управления достигает конца функции main
, то функция impliclty возвращает 0
.
В С++ и C99/C11 без оператора возврата в основной функции он по умолчанию возвращает 0;
§ 3.6.1 Основная функция
Оператор return в main имеет эффект оставления основной функции (уничтожения любых объектов с автоматической продолжительностью хранения) и вызова std:: exit с возвращаемым значением в качестве аргумента. Если элемент управления достигнет конца main без столкновения с оператором return, это эффект выполнения return 0;
также читает wiki page Основная функция C/С++
В случае, если возвращаемое значение не определено программистом, неявный возврат 0; в конце функции main() вставляется компилятором; это поведение требуется по стандарту С++.
main
должен возвращать int
, некоторые компиляторы, включая Turbo С++, могут допускать другие возвращаемые значения, особенно void main
, но это неправильно, никогда не используйте это.
Однако в С++, если вы явно не возвращаете значение в main
, оно равно как return 0;
С++ 11 §3.6.1 Основная функция раздел 5
Оператор return в main имеет эффект оставления основной функции (уничтожения любых объектов с автоматической продолжительностью хранения) и вызова std:: exit с возвращаемым значением в качестве аргумента. Если элемент управления достигнет конца main, но не встречает оператор return, эффект заключается в выполнении
return 0;
Обратите внимание, что для C это поддерживается только на C99 и позже, но не поддерживается C89.
В стандарте указано, что main
вернет 0
, если нет инструкции return
. Из черновик проекта С++ раздел 3.6.1
paragraph 5
:
Оператор return в main имеет эффект оставления основной функции (уничтожения любых объектов с автоматической продолжительностью хранения) и вызова std:: exit с возвращаемым значением в качестве аргумента. Если элемент управления достигает конца main, не встречая оператора return, эффект заключается в выполнении
return 0;
В черновом проекте C99
в разделе 5.1.2.2.3
говорится:
Если тип возврата основной функции является типом, совместимым с int, возврат из начальный вызов основной функции эквивалентен вызову функции выхода со значением возвращает основную функцию в качестве аргумента; 10) достижение}, который завершает основная функция возвращает значение 0.
Из того, что я могу сказать, последняя версия Turbo С++ довольно старая, и я не могу найти ничего, что определяет, какой стандарт, если он поддерживает.
Помимо соответствия произвольному языковому стандарту, нет веских причин возвращать значение, когда заканчивается основная функция.
Только потому, что процессы в популярных операционных системах имеют понятие кода возврата для завершенного процесса. Нетрудно представить себе операционную систему, где им не нужно возвращать какую-либо ценность. Вы также можете представить себе мир, где 0 неявно возвращается всеми процессами, если иное не отменено - в этом случае вы можете делегировать решение обратного кода на системный вызов. (На самом деле такой системный вызов уже существует в виде функции выхода C).
Как заявили другие люди, некоторые компиляторы не требуют явно указать return 0;
, однако всегда полезно (если это возможно). Я бы отказался от использования любого компилятора, который запрещает вам возвращаться из вашей основной функции.
Я хотел бы отметить, что возвращаемое значение из int main очень важно и фактически имеет смысл.
Возвращаемое значение из main иногда упоминается как exit status
или error code
из вашей программы, ноль указывает, что оно завершено успешно. Другие программы и скрипты могут получить доступ к этому коду, чтобы определить, успешно ли выполнена ваша программа.
Дополнительная информация здесь: http://en.wikipedia.org/wiki/Exit_status
TC вернет EXIT_SUCCESS независимо от того, указывается ли явным образом или нет