为什么 stdbool.h 中 true 和 false 的定义与 UNIX 程序的 true 和 false 完全相反?

too*_*ley 5 c history historical-unix exit-status

stdbool.h 通常定义为:

#define false   0
#define true    1
Run Code Online (Sandbox Code Playgroud)

(来源:OpenBSDmusl等)

而 unix 程序false- 只有一个不成功的状态代码,被定义为:

int
main(int argc, char *argv[])
{
    return (1);
}
Run Code Online (Sandbox Code Playgroud)

为完整起见,unix 程序的定义true是:

int
main(int argc, char *argv[])
{
    return (0);
}
Run Code Online (Sandbox Code Playgroud)

很明显,它与falsestdbool.h中的值完全相反。我使用了OpenBSD的版本,因为 coreutils 的版本更冗长

使这些不同的历史原因是什么?

ica*_*rus 6

程序失败的原因有多种。例如grep,如果找不到所需的模式,或者无法打开指定的文件之一,则会失败。

目前,Unix 允许 1 个(无符号)字节值(返回码)从子级传递回其父级(我忽略了有关哪个信号杀死了子级、是否生成了核心等信息,这可能会得到更多信息)位回来)。

由于失败的方式有多种,因此有多个返回代码来编码这些不同的失败,并有一个返回代码来指示成功是有意义的。

由此可见,( 0) 是表示成功的合理选择,其余 (1-255) 表示失败(以及失败的类型)。

完全有可能使用 17 表示成功,并使用 0 到 16 和 18 到 255 表示失败,但为了简单起见,选择 0 表示成功,选择 1 到 255 表示失败,因此有一个范围。同样简单的是使用 255 表示成功,使用 0 到 254 表示失败。然而,这将限制未来的更改以回传超过 8 位,并保持单个故障代码范围的简单性。


Art*_*nov 0

我只能想到这个理由,而且对我来说似乎相当有力。

将布尔运算转换为计算机算术的最简单方法是使用0forFALSE1for TRUE,然后使用它们进行的所有运算都有意义,即

TRUE  && TRUE =  TRUE  ( 1 * 1 = 1)
TRUE  && FALSE = FALSE ( 1 * 0 = 0)
TRUE  || FALSE = TRUE  ( 1 + 0 = 1)
FALSE || FALSE = FALSE ( 0 + 0 = 0)
Run Code Online (Sandbox Code Playgroud)

等等等等。

同时程序需要多种退出状态来报告各种错误。将正确的退出状态设置为0,然后使用剩余的 255 (无符号字符)作为错误的退出状态是合乎逻辑的。

当然,现在本来1可以取得良好的退出状态,但随后糟糕的退出状态就会变成一堆撕裂的阵列02..555这是非常不合逻辑的。

  • 使用低电平有效逻辑,您只需交换“AND”和“OR”的名称,对吧?或者以其他方式建造大门来支持这一点。再说一遍,这是完全有道理的。 (2认同)