用return类型定义的函数没有return语句?

时间:2018-01-27 04:56:03

标签: c

#include <stdio.h>

int main(void)
{
    printf("Hello, World\n");
}

在上面的代码中(最初显示为picture),main函数的返回类型为int,但我们没有在该函数中返回任何值。 即使没有return语句,此函数也可以工作。

这怎么可能?

3 个答案:

答案 0 :(得分:1)

截至C99,它定义明确。

§5.1.2.2.3程序终止

  

到达终止}函数的main返回值0.

答案 1 :(得分:1)

在C99和C11 §5.1.2.2.3 Program termination中,标准规定:

  

5.1.2.2.3程序终止

     

¶1如果main函数的返回类型是与int兼容的类型,则返回   对main函数的初始调用等同于使用值调用exit函数   由main函数返回作为其参数; 11)到达}终止   main函数返回值0.如果返回类型与int不兼容,则为。{   返回到主机环境的终止状态未指定。

           

11)根据6.2.4,在main中声明具有自动存储持续时间的对象的生命周期   将在前一种情况下结束,即使他们不会在后一种情况下。

C90中没有类似的规定。如果从C90程序中的main()返回到最后(而不是通过执行带有值的return),则返回到环境的值是未定义的。代码仍然有效,但shell等程序无法可靠地检测程序是否成功。

  

ISO / IEC 9899:1990

     

5.1.2.2.3程序终止

     

¶1从初始调用到main函数的返回等同于调用exit函数   使用main函数返回的值作为其参数。如果main函数执行不指定值的返回,则返回到主机环境的终止状态是未定义的。

     

6.6.6.4 return语句

     

¶3如果执行了没有表达式的return语句,并且调用者使用了函数调用的值,则行为是未定义的。到达终止函数的}等同于在没有表达式的情况下执行return语句。

C11 §6.8.6.4 The return statement中没有此段落。

因此,如果您的编译器支持C99或C11,则删除main()的末尾等同于return 0;,但在C99之前不是这种情况。我认为这与完全符合C ++ 98(基本上具有相同的规则)以及任何其他原因一样。

就个人而言,我不喜欢该规则,我的main()计划通常会以return 0;结束。

答案 2 :(得分:-1)

这是为了使代码与C的早期阶段兼容。

C编译器隐式为你做了。 :) 即

return 0;