C99 6.9.1 / 12 «Определения функций» гласит:
Если достигнут}, завершающий функцию, и вызывающая сторона использует значение вызова функции, поведение не определено.
C90 6.6.6.4 Стандарт «выражение return
» говорит что-то с эффектом simialr:
Если выполняется оператор return
без выражения, и вызывающая сторона использует значение вызова функции, поведение не определено. Достижение }
, которое завершает функцию, эквивалентно выражению return
без выражения.
Таким образом, возврат из функции без возврата чего-либо из функции разрешен, но вызывающей функции не разрешено использовать «результат» вызова функции. Это неопределенное поведение, и, как упоминалось в других ответах, вы можете получить «ожидаемые» результаты с неопределенным поведением, но это только случайно.
Я полагаю, что обоснование этого заключается в том, что предстандартный C по умолчанию имеет тип возврата int
для функций, если функция не была явно объявлена (или если в объявлении опущен тип возврата), и это продолжало оставаться поддерживается, когда C был стандартизирован. Многие из этих функций были предназначены для вызова только для побочных эффектов, которые они вызывали, и возвращаемое значение не ожидалось и не было предоставлено.
Пара примечаний:
- gcc предупредит об этом, если используется опция
-Wall
. MSVC предупреждает об этом по умолчанию.
- вы должны получить сообщение об ошибке компилятора о строке
if (flag < 0) break;
, поскольку break
не находится в цикле или переключателе.
main()
должен вернуть int
, а не void
(-Wall
также предупредит об этом). Конечно, вы также должны явно возвращать некоторое значение ...