为什么返回0是可选的?
为什么,如果我写
int main() { //... }
我不需要写return 0;
在main
function的最后? 编译器是否为我做了?
我用的是GCC / C99。
如果函数末尾没有显式的return语句,那么最新的C(目前是带有一些修正的C99)默认情况下从main
返回0
,并且控制流出函数的末尾(参见C99 TC3中的 5.1.2.2.3) )。 这是因为大多数情况下,无论如何都会写出这种forms的回报。
在C89中你需要返回一些东西 – 它没有这种隐含的回报。 但编译器绝不需要诊断出这样的错误(参见C89草案中的 3.6.6.4和C99 TC3中的 6.9.1 / 12)。
C99和C ++特例如果控件到达结尾没有显式返回,则返回0的main
函数。 这仅适用于main
function。
对于main
特殊情况,C99规范的相关位是5.1.2.2.3
5.1.2.2.3程序终止
如果main函数的返回类型是与int兼容的类型,则从初始调用返回main函数等同于使用值调用exit函数
由main函数返回作为其参数; 到达终止main函数的}
返回值0。6.9.1 / 12
如果到达终止函数的
}
,并且调用者使用函数调用的值,则行为是未定义的。
你可以用gcc测试一下:
int foo ( void ) { } int main( void ) { }
C89模式(两种function的错误):
sandiego:$ gcc src/no_return.c -std=c89 -Wall src/no_return.c: In function 'main': src/no_return.c:2: warning: control reaches end of non-void function src/no_return.c: In function 'foo': src/no_return.c:1: warning: control reaches end of non-void function
C99模式(主要是特例):
sandiego:$ gcc src/no_return.c -std=c99 -Wall src/no_return.c: In function 'foo': src/no_return.c:1: warning: control reaches end of non-void function
是。 C中的main
是一个非常特殊的函数,它有一些额外的规则。 请参阅C99标准中有关其终止的段落。 从本质上说,如果你在不返回值的情况下退出函数,这就等同于你给出的返回值为0
。 这对于main
是特殊的,对于其他函数这样做,其中调用函数期望返回值可能(并且将)使程序崩溃。
如果main函数的返回类型是与int兼容的类型,则从初始调用返回main函数等效于调用exit函数,并将main函数返回的值作为其参数; 到达终止main函数的}返回值0.如果返回类型与int不兼容,则返回到主机环境的终止状态未指定。
基本上,是的。 函数不需要返回任何东西,即使它们声明了void
之外的返回类型。 返回的值将是未定义的。
请注意,C99要求声明非void
返回类型的函数始终通过命中return语句来终止。 因此,如果您使用编译器的C99模式进行编译,则此代码将导致编译时错误。