22

我有一位同事坚持认为 TRUE 曾经被定义为 0,而所有其他值都是 FALSE。我可以发誓我使用过的每一种语言,如果你甚至可以得到一个布尔值,那么 FALSE 的值是 0。TRUE 曾经是 0 吗?如果是这样,我们什么时候切换的?

4

22 回答 22

29

您的同事对 0 / 非 0 感到困惑的事情可能是指人们使用数值作为表示成功的返回值,而不是真相(即在 bash 脚本和某些 C/C++ 风格中)。

使用 0 = 成功可以更精确地指定失败的原因(例如 1 = 丢失文件,2 = 丢失肢体,等等)。

附带说明:在 Ruby 中,唯一的 false 值是 nil 和 false。0 是正确的,但与其他数字不同。0 为真,因为它是对象 0 的一个实例。

于 2008-09-19T18:28:37.280 回答
20

它可能指的是结果代码 0,在大多数情况下,在进程运行后,结果代码 0 表示“嘿,一切正常,这里没有问题”。

于 2008-09-19T18:19:03.213 回答
12

我在一家拥有大量旧 C 代码的公司工作。一些共享标头为 TRUE 和 FALSE 定义了自己的值,有些确实将 TRUE 设置为 0,将 FALSE 设置为 1。这导致了“真相大战”:

/* like my constants better */
#undef TRUE
#define TRUE 1

#undef FALSE
#define FALSE 0
于 2008-09-22T00:46:33.703 回答
8

如果不出意外,bash shell 仍然使用 0 表示真,使用 1 表示假。

于 2008-09-19T18:18:58.270 回答
4

C 标准库中的几个函数返回一个“错误代码”整数作为结果。由于 noErr 被定义为 0,因此快速检查可以是“如果它是 0,那就没问题”。Unix 进程的“结果代码”采用相同的约定;也就是说,一个整数,它给出了一些关于给定进程如何完成的指示。

在 Unix shell 脚本中,刚刚执行的命令的结果代码是可用的,并且通常用于表示命令是否“成功”,0 表示成功,其他任何内容都表示特定的不成功条件。

因此,shell 脚本中的所有类似测试的构造都使用“成功”(即结果代码 0)来表示 TRUE,而其他任何东西都表示 FALSE。

在完全不同的平面上,数字电路经常使用“负逻辑”。也就是说,即使 0 伏被称为“二进制 0”并且某些正值(通常是 +5v 或 +3.3v,但现在使用 +1.8v 并不少见)被称为“二进制 1”,某些事件也会被“断言”由给定的引脚变为 0。我认为有一些抗噪声优势,但我不确定原因。

但是请注意,这并没有什么“古老”或一些“切换时间”。我所知道的一切都是基于旧的约定,但在今天是完全最新的和相关的。

于 2008-09-19T18:58:37.113 回答
3

我不确定,但我可以告诉你:依赖 TRUE 和 FALSE 的基本性质的技巧很容易出错,因为这些值的定义由语言的实现者决定(或者,至少,说明符)。

于 2008-09-19T18:19:52.057 回答
2

C 标准库中的系统调用通常在错误时返回 -1,在成功时返回 0。此外,Fotran 计算的 if 语句将(并且可能仍然会)跳转到三个行号之一,具体取决于评估为小于、等于或大于零的条件。

例如:IF (I-15) 10,20,10

将测试 I == 15 如果为真(计算为零)跳转到第 20 行,否则跳转到第 10 行的条件。

Sam 对依赖实现细节的特定知识的问题是正确的。

于 2008-09-19T18:41:44.673 回答
2

一般规则:

  1. 外壳(包括 DOS)使用“0”作为“无错误”......不一定是真的。

  2. 编程语言使用非零来表示真。

也就是说,如果您使用的语言允许您定义 TRUE 或 FALSE,请定义它并始终使用常量。

于 2008-09-19T19:32:24.520 回答
1

即使在今天,在某些语言(Ruby、lisp、...)中,0 也是正确的,因为除了 nil 之外的所有内容都是正确的。更常见的是 1 为真。这是一个常见的问题,因此有时认为不依赖 0 为假,而是进行显式测试是一种很好的做法。Java 要求您这样做。

而不是这个

int x;    
....
x = 0;
if (x)  // might be ambiguous
{
}

Make 是明确的

if (0 != x)
{
}
于 2008-09-19T18:26:12.463 回答
1

我记得在 True 为 -1 的访问形式中进行了一些 VB 编程。

于 2008-09-19T18:35:28.650 回答
1

我记得 PL/1 没有布尔类。您可以创建一个位并将其分配为布尔表达式的结果。然后,要使用它,你必须记住 1 是假的,0 是真的。

于 2008-09-19T18:54:06.563 回答
1

当 bash 的真/假返回语句相反时,很容易混淆:

$ false; echo $?
1
$ true; echo $?
0
于 2008-09-19T19:25:18.983 回答
1

在大多数情况下,false 被定义为 0,而 true 是非零。一些编程语言使用 1,一些使用 -1,还有一些使用任何非零值。

但是对于 Unix shell,它们使用相反的约定。

大多数在 Unix shell 中运行的命令实际上都是小程序。它们传回退出代码,以便您可以确定命令是否成功(值为 0),或者它是否由于某种原因失败(1 或更多,取决于失败的类型)。

这在 if/while/until 命令中的 sh/ksh/bash shell 解释器中用于检查条件:

如果命令
然后
   # 成功的
菲

如果命令成功(即返回零退出代码),则执行语句中的代码。通常,使用的命令是 [ 命令,它是 test 命令的别名。

于 2008-09-19T19:28:29.630 回答
1

有趣的是,这取决于您使用的语言。在Lua中是 true == 内部性能为零。对于 C 中的许多系统调用也是如此。

于 2008-09-19T20:19:18.590 回答
1

在 C 语言中,在 C++ 之前,没有布尔值这样的东西。条件是通过测试整数来完成的。零表示假,任何非零都表示真。所以你可以写

if (2) {
  alwaysDoThis();
} else {
  neverDothis();
}

幸运的是,C++ 允许使用专用的布尔类型。

于 2008-09-19T20:43:48.437 回答
1

我听说过并使用过 true > 0 和 false <= 0 的旧编译器。

这是您不想使用 if(pointer) 或 if(number) 检查零的原因之一,它们可能会意外评估为 false。

同样,我曾在 NULL 不为零的系统上工作过。

于 2008-09-21T22:32:10.610 回答
0

在我曾经使用过的任何语言中(回到 70 年代后期的 BASIC),false 被认为是 0,true 被认为是非零。

于 2008-09-19T18:19:17.333 回答
0

我不记得TRUE00不过,C 程序员会返回以表示成功。这可能与TRUE.

也不总是这样1。它可以是-1或只是非零。

于 2008-09-19T18:21:38.527 回答
0

对于没有内置布尔类型的语言,我看到的唯一约定是将 TRUE 定义为 1,将 FALSE 定义为 0。例如,在 C 中,if如果条件表达式的计算结果不是 0,则语句将执行 if 子句.

我什至曾经看过一份编码指南文档,其中明确指出不要重新定义 TRUE 和 FALSE。:)

如果您使用的是具有内置布尔值的语言,例如 C++,那么关键字truefalse是该语言的一部分,您不应依赖于它们的实际实现方式。

于 2008-09-19T18:22:31.210 回答
0

在像 C 这样的语言中,没有布尔值,因此您必须定义自己的值。他们可以处理非标准的 BOOL 覆盖吗?

于 2008-09-19T18:38:29.457 回答
0

应用程序的 DOS 和退出代码通常使用 0 表示成功,非零表示某种类型的失败!

DOS 错误代码是 0-255,当使用 'errorlevel' 语法进行测试时,表示高于或包括指定值的任何内容,因此以下将 2 及以上匹配到第一个 goto,1 到第二个,0(成功)到最后一个!

IF errorlevel 2 goto CRS
IF errorlevel 1 goto DLR
IF errorlevel 0 goto STR
于 2008-09-19T19:10:44.277 回答
0

SQL Server 数据库引擎优化了位列的存储。如果表中有 8 个或更少的位列,则这些列存储为 1 个字节。如果有 9 到 16 位列,则这些列存储为 2 个字节,依此类推。字符串值 TRUE 和 FALSE 可以转换为位值:TRUE 转换为 1,FALSE 转换为 0。转换为位可将任何非零值提升为 1。

每种语言都可以有 0 作为真或假所以停止使用数字使用单词 true Lol 或 t 和 f 1 字节存储

于 2016-09-09T11:46:42.660 回答