在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(或任何语法碰巧)都是安全的。即使这样,我见过的每种语言都有一个notor !运算符;它在那里,所以您不妨使用它。使用cond == false而不是!cond或not cond不,在我看来,提高可读性。(确实,!角色一目了然很难看到;!为避免这种情况,我有时会在其后添加一个空格。)
通常,您可以通过稍微重新排列代码来避免此问题并提高清晰度。例如,而不是:
if (!cond) {
do_this();
}
else {
do_that();
}
您可能会写:
if (cond) {
do_that();
}
else {
do_this();
}
这并不总是更好,但是在适当的地方寻找机会也没有什么坏处。
摘要:在C和C ++,平等比较,true并且false是危险的,过于冗长,差的风格。在许多其他语言中,这样的比较可能并不危险,但它们仍然过于冗长且风格欠佳。