在C ++中main ()
是否真的需要包含return 0;
?
它是仅适用于main
还是适用于任何非空函数?
它是C ++ 11中的新功能还是总是这样?
理由是什么?
答案 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()
来帮助开发人员。