这个问题听起来很愚蠢,但是为什么大多数编程语言都将0
求值false
和其他任何[整数]值true
呢?
字符串比较
由于问题似乎太简单了,所以我将对自己进行一些解释:首先,对于任何程序员来说,这似乎都是显而易见的,但是为什么没有编程语言呢?实际上可能是,但是没有我用了-在哪0
求和true
,所有其他[整数]值都在false
?这句话似乎是随机的,但我举了一些例子,可能是个好主意。首先,让我们以字符串三向比较为例,以C strcmp
为例:任何以C为第一语言的程序员都可能会编写以下代码:
if (strcmp(str1, str2)) { // Do something... }
由于strcmp
返回的0
结果是评估false
字符串何时相等,因此初阶程序员尝试执行的操作很失败,而且他通常一开始并不理解为什么。曾0
评估,以true
代替,这个功能可能已在其最简单的表达式中使用-上面的一员-平等的比较时,以及适当的检查-1
,并1
在需要时将已只是做。bool
在大多数情况下,我们会认为返回类型是(在我们看来)。
此外,我们引入一个新的类型,sign
即只需要值-1
,0
和1
。那可能很方便。想象一下,在C ++中有一个太空飞船运算符,我们想要它std::string
(好吧,已经有compare
函数了,但是太空飞船运算符更有趣)。该声明当前将是以下声明:
sign operator<=>(const std::string& lhs, const std::string& rhs);
已经0
被评估为true
,飞船运营商甚至不存在的,我们可以宣称operator==
这种方式:
sign operator==(const std::string& lhs, const std::string& rhs);
这operator==
将立即处理三向比较,并且仍然可以用于执行以下检查,同时在需要时仍能够检查哪个字符串在字典上优于另一个字符串:
if (str1 == str2) { // Do something... }
旧错误处理
现在我们有了例外,因此本部分仅适用于不存在此类旧语言的旧语言(例如C)。如果我们看一下C的标准库(还有POSIX),我们可以肯定地看到maaaaany函数0
在成功时返回,否则返回任何整数。我可悲地看到有些人做这种事情:
#define TRUE 0
// ...
if (some_function() == TRUE)
{
// Here, TRUE would mean success...
// Do something
}
如果我们考虑编程中的想法,我们通常具有以下推理模式:
Do something
Did it work?
Yes ->
That's ok, one case to handle
No ->
Why? Many cases to handle
如果我们再考虑一下,将唯一的中性值0
放到yes
(这就是C函数的工作方式)上是有意义的,而所有其他值都可以用来解决no
。然而,在我所知道的所有编程语言(可能除了一些实验esotheric语言),即yes
计算为false
在if
状态,而所有的no
情况下,计算结果为true
。在许多情况下,“有效”代表一种情况,而“无效”则代表许多可能的原因。如果我们以这种方式思考,那么0
对评估true
和其余评估false
将更有意义。
结论
我的结论基本上是我原来的问题:为什么我们的设计语言;这里0
是false
和其它值true
,同时帐户我举几个例子上面,也许一些我没想到的?
后续行动:很高兴看到有很多答案,其中有很多想法,并且有很多可能的原因。我喜欢您似乎对此充满热情。我本来是出于无聊的问题而提出这个问题的,但是由于您似乎太热情了,所以我决定进一步探讨一下Math.SE上布尔选择0和1的理由:)
if true ; then ... ; fi
:where true
是一个返回零的命令,该命令告诉if
run ...
。
bool
类型,但是比较/ if条件等可以具有任何返回值。
strcmp()
不是true或false的好例子,因为它返回3个不同的值。当您开始使用shell时,您会感到惊讶,其中0表示true,其他表示false。