在C语言和某些类似语言中,比较布尔表达式是否等于false
或true
具有危险习惯。
在C语言中,任何标量表达式(数字或指针)都可以在布尔上下文中使用,例如,作为if
语句的条件。C规则if (cond)
等效于if (cond != 0)
-即零为false,任何非零值为true。如果cond
是指针类型,则将其0
视为空指针常量;否则为false。if (ptr)
意味着if (ptr != NULL)
。
这意味着
if (cond)
和
if (cond == true)
没什么意思。如果cond
非零,则第一个为true;否则为false 。第二个只有在等于时才是正确的true
,在C中(如果有的话#include <stdbool.h>
)就是1
。
例如,如果参数为数字,则isdigit()
in中声明的函数<ctype.h>
将返回一个int
值,0
否则为非零。它可以返回42
以表明条件为真。比较42 == true
将失败。
碰巧这0
是唯一被认为是错误的值,因此比较是否相等false
将起作用。if (!cond)
并if (cond == false)
做同样的事情。但是,如果要利用这一点,则必须记住,与进行比较false
是可以的,而与进行比较是不可行的true
。更糟糕的是,相比true
将工作的大部分时间(例如,平等,关系运算符总是产生两种0
或1
)。这意味着使用此工具引入的任何错误仍然可能很难找到。(不用担心,一旦您将代码演示给重要的客户,它们就会出现。)
C ++的规则略有不同。例如,其bool
类型与语言紧密集成在一起,并if (cond)
转换cond
为type bool
。但是效果(大部分)是相同的。
其他一些语言具有所谓的行为更佳的布尔值,因此cond == true
和cond == false
(或任何语法碰巧)都是安全的。即使这样,我见过的每种语言都有一个not
or !
运算符;它在那里,所以您不妨使用它。使用cond == false
而不是!cond
或not cond
不,在我看来,提高可读性。(确实,!
角色一目了然很难看到;!
为避免这种情况,我有时会在其后添加一个空格。)
通常,您可以通过稍微重新排列代码来避免此问题并提高清晰度。例如,而不是:
if (!cond) {
do_this();
}
else {
do_that();
}
您可能会写:
if (cond) {
do_that();
}
else {
do_this();
}
这并不总是更好,但是在适当的地方寻找机会也没有什么坏处。
摘要:在C和C ++,平等比较,true
并且false
是危险的,过于冗长,差的风格。在许多其他语言中,这样的比较可能并不危险,但它们仍然过于冗长且风格欠佳。