为什么返回0是可选的?

Any*_*Way 11 c

为什么,如果我写

int main() 
{ 
    //... 
}
Run Code Online (Sandbox Code Playgroud)

return 0;main功能结束时我不需要写吗?编译器是否为我做了?

我用的是GCC/C99.

Pet*_*ham 20

C99和C++特例main如果控件到达结尾没有显式返回,则返回0 的函数.这适用于该main功能.

对于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 ) { }
Run Code Online (Sandbox Code Playgroud)

C89模式(两种功能的错误):

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


Joh*_*itb 15

最近C(目前这是C99的几个修正案)返回0main默认如果在函数结束没有明确return语句,并且控制流出该功能的终端(见5.1.2.2.3在C99 TC3).这是因为大多数情况下,无论如何都会写出这种形式的回报.

在C89中你需要返回一些东西 - 它没有这种隐含的回报.但编译器绝不需要诊断这样的错误(参见C89草案中的 3.6.6.4 和C99 TC3中的 6.9.1/12 ).