在C ++中返回函数退出的值

时间:2016-08-18 19:46:51

标签: c++ c++11 iso

在C ++中main ()是否真的需要包含return 0;

它是仅适用于main还是适用于任何非空函数?

它是C ++ 11中的新功能还是总是这样?

理由是什么?

3 个答案:

答案 0 :(得分:2)

如果未明确返回值,则main()函数保证返回0。这在ISO标准中定义:

  

3.6.1 / 5: return中的main语句具有离开main功能的效果(销毁具有自动存储持续时间的任何对象)和   以返回值作为参数调用std::exit。如果控制   在没有遇到return语句的情况下到达main的末尾   效果是执行

return 0;

此特殊行为仅适用于main(),因为main()是返回int的函数,标准定义了一般规则:

  

6.6.3 / 2 从函数末尾流出相当于没有值的返回值;这导致a中的未定义行为   价值回归功能。

现在,它总是那样吗? Bjarne Stroutsturp在 C ++编程语言中,在1986年的版本中,早在任何标准化之前,就表明了这一点。在他的教程章节的大多数例子中,main()没有返回值,并且在这个早期版本的第82页上,他声明:

  

传统上,如果程序正常终止,main()将返回0   否则为非零,因此返回错误数   很好地完成了这个

补充说明

在本书中,规则是隐含的例子和附带的解释; Stroustrup没有明确说明main()一般的明确规则,也没有在1994年的“C ++设计和进化”一书中提及它。

需要注意的是,在C89中,在没有明确的返回值的情况下原则仍然是未定义的行为,直到C99到来。但是在C ++ 98中,默认情况下当前的0返回规则已经正式化。所以我认为这不是为了向后兼容C。

答案 1 :(得分:0)

  

在C ++中main ()是否真的需要包含return 0;

  

它是仅适用于main还是适用于任何非void函数?

仅适用于main()

  

它是C ++ 11中的新功能还是总是这样?

不,总是那样。

  

理由是什么?

最有可能的语言的向后兼容性(以及与C的兼容性)。

答案 2 :(得分:0)

[basic.start.main]/5(强调我的):

  

main中的return语句具有离开main函数的效果   (销毁具有自动存储持续时间的任何对象)并调用   std :: exit,返回值作为参数。 如果控制流出   主要的复合语句结束,效果相当于   带操作数0的返回(另见[except.handle])。

似乎一直都在C ++标准中(在C语言中也是如此,从C99开始 - 参见C99规范§5.1.2.2.3)。

它仅适用于main()功能。

我不知道原来的理由。可能是“通过保存他们在return 0; ”末尾键入main()来帮助开发人员。