请注意,我运行的是 linux 机器,尽管我认为在 windows(或其他)机器上的结果没有什么不同。
这是一个简单的问题 - C++ 程序通常返回 32 位 int。如果我返回-1
,然后从终端打印结果,结果是255
。
这是为什么?我觉得链接这是我应该知道的,或者很多年前就应该注意到的 - 我以前从未真正使用过返回码,也从未想过它。
测试C++程序:
int main()
{
return -1;
}
编译:
g++ main.cpp -o a.out
运行:
./a.out
检查结果:
echo $?
结果:
255
我本以为会看到 2^32 - 1。
为什么结果 255
不是 -1
甚至 4294967295
。 (2^32 - 1
)
因为(不是所有)操作系统使用整个返回值。在本例中,它被截断为低 8 位。 “使用”和“保留”这个值取决于操作系统(和其他相关组件,例如 shell),这就是所谓的“实现细节”,换句话说,C 和 C++ 标准没有说明什么返回值的用处或意义是 [除了下面的段落] - 只是从 C 的角度来看它是一个 int
- C 程序可能会在该值被忽略、截断、扩展或乘以 432 的环境中启动,并且它仍然是有效的 C 或 C++ 环境。
C 标准规定值 0
或 EXIT_SUCCESS
(据我所知应该是零值)和值 EXIT_FAILURE
(一些非零值)应该分别被认为是成功和失败。但是,所有其他值都是“实现定义的”,因此在执行发生的操作系统/环境的规则下。
请注意,当 shell(或任何运行您的程序的程序)时,它不会直接跳转到您的 main
。 ,但首先执行一些其他功能来初始化您的 main
所需的东西功能。还有一次main
已经返回/退出,通常也会有一些代码在你的程序之后执行。具体如何工作取决于几件事:
- 谁编写了编译器和/或运行时库
- 它是为什么操作系统设计的
- 它是什么处理器架构
- 可能是什么 shell/runtime/OS 功能启动了这个过程
C 和 C++ 标准没有定义这些东西,因为这样做可能会影响能够/将要运行 C 和/或 C++ 应用程序的实际平台,而 C 和 C++ 的目标是“包容”-换句话说,尽量不要限制语言支持的环境、处理器等。