Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+;中的函数退出时返回值+; 是不是在C++中代码>主())/代码>不需要包含返回0;_C++_C++11_Iso - Fatal编程技术网

在C+;中的函数退出时返回值+; 是不是在C++中代码>主())/代码>不需要包含返回0;

在C+;中的函数退出时返回值+; 是不是在C++中代码>主())/代码>不需要包含返回0;,c++,c++11,iso,C++,C++11,Iso,它是否仅适用于main或任何非无效函数 它在C++11中是新出现的还是一直都是这样 理由是什么 是不是在C++中代码>主())/代码>不需要包含返回0; 对 它只适用于main函数还是任何非void函数 它仅适用于main() 它在C++11中是新出现的还是一直都是这样 不,一直都是这样 理由是什么 该语言的向后兼容性(以及与C的兼容性)最有可能。(重点是我的): main中的return语句具有离开main函数的效果 (销毁任何具有自动存储持续时间的对象)并调用 以返回值作为参数退出如果控制流

它是否仅适用于
main
或任何非无效函数

它在C++11中是新出现的还是一直都是这样

理由是什么

是不是在C++中代码>主())/代码>不需要包含<代码>返回0;<代码>

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

它仅适用于
main()

它在C++11中是新出现的还是一直都是这样

不,一直都是这样

理由是什么

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

(重点是我的):

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

它似乎一直在C++标准中(也在C中,从C99开始,参见C99规范5.5.2.2.3)。 它仅适用于

main()
函数

不过,我不知道最初的理由。它可能是“通过在
main()。这在ISO标准中有定义:

3.6.1/5:main
中的
return
语句具有退出
main
功能(销毁任何具有自动存储持续时间的对象)的效果,并且 使用返回值作为参数调用
std::exit
。如果控制 到达main的结尾时未遇到return语句 效果是执行

返回0

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

6.6.3/2从函数末尾流出相当于没有值的返回;这将导致未定义的行为 值返回函数

现在,事情总是这样吗?Bjarne Stroutsturp在C++程序设计语言中,在1986版之前,早在任何标准化之前就提出了这一点。在他教程章节的大多数示例中,
main()
不返回值,在早期版本的第82页,他指出:

按照惯例,如果程序正常终止,main()返回0 否则为非零,因此返回错误数 很好地完成了这一点

附加备注

然而,在这本书中,从例子和公司的解释中,这个规则是隐含的;在Stroustrup的《C++ 1994》的设计和演化中,他没有明确地提出一个通用的、不规则的规则:<代码>主代码()/>代码>。p>
需要注意的是,在C89中,在没有显式返回值的情况下,原则仍然是未定义的行为,直到C99到达。但是在C++98中,当前默认返回0的规则已经形式化了。所以我认为这不是为了与C向后兼容。

“不需要”!=“不应该”这个词一直被使用,你到底是什么意思?
main()
不需要这样做。这取决于您,它是可选的。那么,如果它不是
必需的,我为什么要包括它呢?只是好奇。“阿空加瓜山是的,它是不允许的:你是指与C++ 98?@罗西的向后兼容性,我一般是指C++语言。当然,在C99(我想)中添加了与标准C隐式<代码> 0返回<代码>的兼容性(我想),这比C++标准化的要晚。我想在这种情况下,这种影响是相反的(或者源影响可以共享——比如说一个普通的编译器扩展,它是C++中比C更早的)。如果是这样做,可能是将C代码转换成C++,而只需将<代码>空白>代码>转换成<代码> int >代码>。它是MSVC编译器的扩展。