Ответ на этот вопрос, поскольку все существующие ответы говорят о том, что это неопределенное поведение, что неверно, поэтому я ничего не имею IC upvote.
В C89 (благодаря PMG для ссылки на draft standard), 5.1.2.2.3:
Возвращение из начального вызова к основной функции является эквивалентно вызову функции выхода с значение , возвращаемое главной функцией в качестве аргумента. Если достигнуто значение} , которое завершает основную функцию, статус завершения , возвращенный в среду хоста, является неуказанным.
В C99, цитируя n1256, 5.1.2.2.3:
Если тип возвращаемого основного функции представляет собой тип совместим с Int, возвращение из начального вызова основная функция эквивалентна вызывающей функции выхода со значением возвращаемого основная функция: его аргумент; достигая}, завершает основную функцию, возвращает значение 0. Если тип возврата не является , совместимым с int, то завершение статус, возвращенный хосту , не указывается.
Таким образом, это не «неопределенное поведение»: он ведет себя, как если main
функция возвращает, но в C89 возвращаемое значение не определено стандартом. Для вашей примерной программы, по вашей реализации, возвращаемое значение, по-видимому, должно быть 12, предположительно по той причине, о которой говорит Бен Фойгт. Поскольку вы работаете в Linux, вероятно, не очень важно скомпилировать ваш код как C99 (или, во всяком случае, скомпилировать его с использованием почти совместимого режима C99 gcc).
Для любой функции, которая возвращает значение, кроме main
, он является неопределенного поведения, если абонент не использует возвращаемое значение (n1256, 6.9.1/12):
Если функция}, которая завершает функцию, достигла , и значение функции вызова используется вызывающим абонентом, поведение не определено.
Я не уверен, следует ли упоминать первоначальный звонок main
как исключенный из этого общего правила. Это не должно быть: из POV стандарта, этот вызов не имеет вызывающего абонента, поэтому я думаю, что значение вызова функции не «используется вызывающим», даже если оно становится статусом завершения для программы.
+1 хороший вопрос. :) – Pavitar
http://stackoverflow.com/questions/204476/what-should-main-return-in-c-and-c –