Почему нет необходимости включать оператор return при использовании int main () в некоторых компиляторах для C ++? А что насчет Turbo C ++?
Должна ли функция int main () возвращать значение во всех компиляторах?
Ответы (7)
В C ++, а также в C99 и C11 это особое правило языка: если поток управления достигает конца функции main
, функция неявно возвращает 0
.
void main()
.
- person ; 23.08.2013
main()
, будет делать то же самое в других функциях.
- person ; 23.08.2013
0
без нужды, скорее всего, не понимает, поэтому он, скорее всего, упадет с конца функции. Они, наверное, тоже пишут функции длиной в 500 строк :)
- person juanchopanza; 23.08.2013
return 0;
в конце main()
. (Да, теперь ты скажешь мне, что я понятия не имею ...)
- person ; 23.08.2013
-Wall -Werror
, поэтому компиляция не удастся из-за этого бесполезного исключения ...
- person nijansen; 23.08.2013
main
, не может быть очень хорошим ...
- person chris; 23.08.2013
void main()
(и заставить среду выполнения преобразовать его в int main()
, возвращающий 0), а не иметь это странное исключение из правил возврата. Но может это только я.
- person syam; 23.08.2013
main
в любом случае не похожа на любую другую функцию (она должна возвращать и int
и имеет как минимум две возможные сигнатуры списка параметров, но вы не можете ее перегрузить, вы не можете явно вызвать ее из кода, вы не можете взять ее адрес ...), и каждый достойный программист на C ++ должен знать (или выучить), что это особенный. (В настоящее время реальный код часто возвращает код ошибки (отличный от нуля) из main
в случае сбоя, поэтому тогда вполне естественно явно возвращать ноль в случае отсутствия сбоя.)
- person gx_; 23.08.2013
main
только ради неаккуратных программистов. Другие int
-возвращающие функции не будут возвращать 0
, если управление достигает своего конца и нет оператора возврата. Итак, правило должно применяться ко всем функциям или вообще ни к каким функциям.
- person Kaz; 23.08.2013
В C ++ и C99 / C11 без оператора return в основной функции по умолчанию возвращается 0;
§ 3.6.1 Основная функция
Оператор return в main имеет эффект выхода из основной функции (уничтожение любых объектов с автоматической продолжительностью хранения) и вызова std :: exit с возвращаемым значением в качестве аргумента. Если элемент управления достигает конца main, не встречая оператора return, результатом будет выполнение return 0;
также прочтите вики-страницу Основная функция C / C ++
Если возвращаемое значение не определено программистом, неявный возврат 0; в конец функции main () вставляется компилятором; такое поведение требуется стандартом C ++.
main
должен возвращать int
, некоторые компиляторы, включая Turbo C ++, могут допускать другие возвращаемые значения, особенно void main
, но это неправильно, никогда не используйте это.
Однако в C ++, если вы явно не возвращаете значение в main
, это то же самое, что и return 0;
C ++ 11 §3.6.1 Основная функция раздел 5
Оператор return в main имеет эффект выхода из основной функции (уничтожение любых объектов с автоматической продолжительностью хранения) и вызова std :: exit с возвращаемым значением в качестве аргумента. Если элемент управления достигает конца main, не встречая оператора return, результатом будет выполнение
return 0;
Обратите внимание, что для C это поддерживается только в C99 и более поздних версиях, но не поддерживается в C89.
В стандарте сказано, что main
вернет 0
, если нет оператора return
. Из раздела черновик стандарта C ++ 3.6.1
абзац 5
:
Оператор return в main имеет эффект выхода из основной функции (уничтожение любых объектов с автоматической продолжительностью хранения) и вызов std :: exit с возвращаемым значением в качестве аргумента. Если элемент управления достигает конца основного элемента, не встречая оператора return, результатом будет выполнение
return 0;
В C99
проекте стандарта в разделе 5.1.2.2.3
говорится:
Если тип возврата основной функции является типом, совместимым с int, возврат от первоначального вызова к основной функции эквивалентен вызову функции выхода со значением, возвращаемым основной функцией в качестве аргумента; 10) достижение }, завершающий основную функцию, возвращает значение 0.
Насколько я могу судить, последняя версия Turbo C ++ довольно старая, и я не могу найти ничего, что определяет, какой стандарт он поддерживает.
TC вернет EXIT_SUCCESS независимо от того, явно вы указали или нет
За исключением соответствия произвольному языковому стандарту, нет никаких веских причин для возврата значения после завершения основной функции.
Это происходит только потому, что процессы в популярных операционных системах имеют представление о коде возврата для завершенного процесса. Нетрудно представить операционную систему, в которой им не нужно возвращать какое-либо значение. Вы также можете представить себе мир, в котором 0 неявно возвращается всеми процессами, если иное не отменено - и в этом случае вы можете делегировать решение о коде возврата системному вызову. (Фактически, такой системный вызов уже существует в виде функции выхода C).
Как утверждали другие люди, некоторые компиляторы не требуют, чтобы вы явно return 0;
, однако всегда рекомендуется (если возможно). Я бы не одобрил использование любого компилятора, который запрещает вам возвращаться из вашей основной функции.
Хочу отметить, что возвращаемое значение int main очень важно и действительно имеет применение.
Возвращаемое значение из main иногда называют exit status
или error code
из вашей программы, ноль означает, что она завершилась успешно. Другие программы и сценарии могут получить доступ к этому коду, чтобы определить, успешно ли завершилась ваша программа.
Дополнительная информация здесь: http://en.wikipedia.org/wiki/Exit_status.
void main
(что недопустимо для C ++) и возвращает вам 0. - person chris   schedule 23.08.2013