为什么返回0是可选的?

为什么,如果我写

int main() { //... } 

我不需要写return 0;mainfunction的最后? 编译器是否为我做了?

我用的是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函数。 这适用于mainfunction。

对于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模式进行编译,则此代码将导致编译时错误。