ISO 1998 c ++标准规定,在main中不明确使用return语句相当于使用return 0
。
但是,如果实现具有不同的标准“无错误”代码,例如-1
?
为什么不使用可由EXIT_SUCCESS
或0
替换的标准宏-1
或任何其他值,具体取决于实施?
C ++似乎强制程序的语义,这不是一种语言的角色,它应该只描述程序的行为方式。此外,“错误”返回值的情况也不同:只有EXIT_FAILURE
是标准的“错误”终止标志,没有明确的值,例如“1”。
这些选择的原因是什么?
答案 0 :(得分:35)
从main()
返回零基本上与您所要求的相同。从main()
返回零不必将零返回到主机环境。
来自C90 / C99 / C ++ 98标准文件:
如果status的值为零或
EXIT_SUCCESS
,则返回状态成功终止的实现定义形式。
答案 1 :(得分:18)
实际上,return 0
不一定会返回0!我在这里引用C标准,因为这是我最了解的。
关于return
中的main()
:
5.1.2.2.3程序终止
如果main函数的返回类型是与
int
兼容的类型,则从初始调用到main
函数的返回等同于使用值调用exit
函数由main
函数返回作为其参数;
关于exit()
:
7.20.4.3退出功能
概要#include <stdlib.h> void exit(int status);
[...]
最后,控制权返回给主机环境。如果status
的值为零或EXIT_SUCCESS
,状态成功终止的实现定义形式 返回。
答案 2 :(得分:5)
标准只是确定未明确设置时必须是什么值。开发人员可以显式设置返回值,也可以为默认值设置适当的语义。我不认为该语言试图强迫开发人员使用任何语义。
答案 3 :(得分:4)
0是所有POSIX系统上的标准(成功)退出代码,以及我所知道的所有系统!我认为这种方式一直都是这样的(或者至少从Unix开始......)因此我会这样说。
你知道什么系统不同?
答案 4 :(得分:3)
0作为成功的返回码,而正整数作为错误是C和Unix的标准。选择这个方案是因为通常人们不关心为什么一个程序成功,只是它确实如此。另一方面,有很多方法可以使程序失败并出现错误,并且通常会对此信息感兴趣。因此,使用标量值表示成功以及使用一系列错误值是有意义的。使用正整数是一种节省内存的C约定,因为它们允许将错误代码定义为unsigned int。
答案 5 :(得分:2)
OS / 360和后继者使用数字退出代码,0
通常成功,4
用于警告(例如生成警告消息的编译器),8
表示错误,以及12
表示特别糟糕的错误
(例如无法打开标准输出单元SYSPRINT。)
答案 6 :(得分:1)
计算机语言标准说明用该语言编写的程序必须做什么,以及将会发生什么。在这种情况下,C和C ++标准表示返回0表示成功,等等。
语言实现允许程序在特定实现上运行。实现者的工作是弄清楚如何根据标准使I / O工作,或者为操作系统提供正确的结果代码。
程序的功能以及操作系统看到的内容不一定是一回事。所有必要的是程序按照标准在给定的OS上运行。
答案 7 :(得分:1)
通过浏览cstdlib
我最终得到两行:
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
因此,EXIT_SUCCESS
等于0
,而EXIT_FAILURE
等于1
,这意味着无关紧要。
检查Linux(OpenSuse)并最终得到同样的东西。
答案 8 :(得分:0)
如果您还在考虑为什么成功的错误代码是0而不是任何其他值,我会补充说它可能在历史上出于性能原因,因为与0的比较速度要快得多(我认为在现代架构中)可能与任何数字相同)并且通常你不检查特定的错误代码,只要它是成功或任何错误(因此使用最快的比较是有意义的。)