为什么返回0是可选的?

时间:2010-11-09 21:08:25

标签: c

为什么,如果我写

int main() 
{ 
    //... 
}

我不需要在return 0;函数的末尾写main吗?编译器是否为我做了?

我使用GCC / C99。

4 个答案:

答案 0 :(得分:19)

C99和C ++特例main函数如果控件到达结尾但没有显式返回则返回0。此适用于main功能。

对于main特殊情况

,C99规范的相关位是5.1.2.2.3
  

5.1.2.2.3程序终止

     

如果是主函数的返回类型   是一个与int兼容的类型,a   从最初的呼叫返回到   main函数相当于调用   值为
的退出函数   由main函数返回   参数; 到达那个}   终止主函数返回   值为0.

     

6.9.1 / 12

     

如果终止某个功能的}是   达到了,功能的价值   呼叫由呼叫者使用   行为未定义。

您可以使用gcc:

进行测试
int foo ( void ) { }
int main( void ) { }

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

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

答案 1 :(得分:14)

如果在函数末尾没有显式的return语句,并且控制流出函数,那么最新的C(当前是带有一些修改的C99)默认从0返回main结束(见C99 TC3中的5.1.2.2.3)。这是因为无论如何,大多数人都会写这种形式的回报。

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

答案 2 :(得分:2)

是。 C中的main是一个非常特殊的函数,它有一些额外的规则。请参阅C99标准中有关其终止的段落。从本质上说,如果你退出函数而不返回一个值,这就等同于你给出了0的返回值。这对于main来说是特殊的,对于调用函数期望返回值可能(并且会)使程序崩溃的其他函数也是如此。

  

如果主要的返回类型   function是一种兼容的类型   int,从最初的调用返回到   主要功能相当于   用the调用exit函数   main函数返回的值为   它的论点;达到那个   终止main函数返回一个   值为0.如果返回类型不是   兼容int,终止   状态返回给主机   环境未明确。

答案 3 :(得分:-1)

基本上,是的。函数不需要返回任何内容,即使它们声明了void以外的返回类型。返回的值将是未定义的。

请注意,C99要求声明非void返回类型的函数始终通过命中return语句来终止。因此,如果您使用编译器的C99模式进行编译,则此代码将导致编译时错误。