回答是因为所有现有的答案都说这是未定义的行为,这是不正确的,所以我没有什么可以支持的。
在 C89 中(感谢 pmg 参考标准草案),5.1.2.2.3:
从初始调用返回到主函数等效于以主函数返回的值作为参数调用退出函数。如果到达终止 main 函数的 },返回给宿主环境的终止状态是未指定的。
在 C99 中,引用 n1256, 5.1.2.2.3:
如果 main 函数的返回类型是与 int 兼容的类型,则从初始调用到 main 函数的 return 等价于以 main 函数返回的值作为参数调用 exit 函数;到达终止 main 函数的 } 返回值 0。如果返回类型与 int 不兼容,则返回给宿主环境的终止状态未指定。
因此,这不是“未定义的行为”:它的行为就像main
函数返回一样,但在 C89 中,返回的值没有由标准指定。对于您的示例程序,在您的实现中,返回的值似乎始终为 12,这可能是 Ben Voigt 所说的原因。由于您使用的是 linux,因此将代码编译为 C99(或者无论如何,使用 gcc 几乎兼容的 C99 模式编译它)可能并不是什么大的变化。
对于任何返回值的函数,除了 之外main
,它是未定义的行为,除非调用者不使用返回值(n1256,6.9.1/12):
如果到达终止函数的 },并且调用者使用了函数调用的值,则行为未定义。
我不确定是否main
应将最初的呼叫提及为排除在此一般规则之外。不需要是:从标准的POV来看,那个调用没有调用者,所以我认为函数调用的值不是“被调用者使用”,即使它变成了终止状态为程序。