Я предположил, что в определении Howevverf2 (), поскольку функция ничего не возвращала, компилятор неявно добавил return 0; в конце.
Это неверно. Согласно стандарту C, если программа пытается использовать значение вызова функции, но функция не использует return
для возврата значения, поведение не определено (C 2018 6.9.1 12). (За исключением того, что main
является особенным, правило в 5.1.2.3 1 говорит, что по умолчанию оно возвращает ноль.)
Однако, почему такое поведение не происходит с f ()?
Было замечено, что G CC ведет себя следующим образом: если в непустой функции нет оператора return
, он возвращает значение последнего вычисленного выражения. Я не видел этого документированного, и вы не должны полагаться на это поведение. (Отчасти потому, что это правило неполное. Например, если последнее выражение имеет тип double
, а тип возвращаемого значения - int
, мы не ожидаем, что правило будет выполнено.)
В этом случае это поведение заставляет f
или f1
возвращать три, потому что последнее выражение, оцененное в нем, является printf("foo");
, а значение вызова printf
является количеством напечатанных символов, которое в данном случае равно трем.