In C, цитата N1256 6.9.1p12:
Если достигнута } , которая завершает функцию, и значение
Вызов функции используется вызывающей стороной, поведение не определено.
Таким образом, законно (но это плохая идея) для функции, не являющейся пустым, не возвращать значение, но если это так и , вызывающая сторона пытается использовать результат, поведение не определено. Обратите внимание, что он не обязательно просто возвращает произвольное значение; Что касается стандарта, все возможно.
В пред-ANSI C не было ключевого слова void
, поэтому способ написания функции, которая не возвращала значение, заключался в том, чтобы исключить возвращаемый тип, неявно возвращая int
. Требование оператора return
в функции, возвращающей значение, сломало бы старый код. Кроме того, компилятору потребовался бы дополнительный анализ, чтобы определить, что все пути кода попадают в оператор return
; такой анализ является разумным для современных компиляторов, но, возможно, был чрезмерным бременем, когда C был впервые стандартизирован.
C ++ немного более строгий. В C ++:
Вывод из конца функции эквивалентен return с
неважно; это приводит к неопределенному поведению в возвращающем значение
функция.
, поэтому поведение не определено, пытается ли вызывающий использовать (несуществующий) результат или нет.
Компиляторы
C и C ++, конечно, могут предупредить о пропущенных return
операторах или о путях управления, которые выходят за пределы функции без выполнения оператора return
, но соответствующие стандарты не требуют им сделать это.