Ответ, потому что все существующие ответы говорят, что это неопределенное поведение, что не соответствует действительности, поэтому у меня нет ничего, что я мог бы поднять.
В C89 (спасибо pmg за ссылку на черновой стандарт ), 5.1.2.2.3:
Возврат из первоначального звонка на
Основная функция
эквивалентно вызову функции выхода со значением
возвращается основной функцией в качестве аргумента. Если}
который завершает основную функцию достигается,
статус завершения, возвращенный в среду хоста
не определено.
В C99, цитата из n1256, 5.1.2.2.3:
Если тип возврата основного
функция совместима с типом
int, возврат из начального вызова
основная функция эквивалентна
вызывая функцию выхода с
значение, возвращаемое основной функцией как
его аргумент; достигая}, что
завершает основную функцию возвращает
значение 0. Если тип возвращаемого значения не
совместим с int, прекращение
статус возвращен на хост
среда не указана.
Таким образом, это не «неопределенное поведение»: оно ведет себя так, как будто функция main
возвращает, но в C89 возвращаемое значение не указано стандартом. Для вашей программы-примера в вашей реализации возвращаемое значение будет, по-видимому, равным 12, предположительно по причине, которую говорит Бен Фойгт. Поскольку вы работаете в Linux, вероятно, нет ничего особенного в том, чтобы компилировать ваш код как C99 (или в любом случае, скомпилировать его, используя почти совместимый с gcc режим C99).
Для любой функции, которая возвращает значение, отличное от main
, оно равно неопределенному поведению, , если вызывающая сторона не использует возвращаемое значение (n1256, 6.9.1 / 12):
Если}, завершающий функцию,
достигнуто, и значение функции
вызов используется вызывающей стороной,
поведение не определено.
Я не уверен, следует ли упоминать начальный вызов main
как исключенный из этого общего правила. Это не должно быть: из POV стандарта этот вызов не имеет вызывающей стороны, поэтому я думаю, что значение вызова функции не «используется вызывающей стороной», даже если оно становится статусом завершения. для программы.