今天我经历了"Mozilla Coding Style Guideline",我找到了一个我不确定的观点。
以下陈述对他们意味着什么?
不要比较
x == true
或x == false
。请改用(x)
或(!x)
。事实上,x == true
与if (x)
不同!
我不确定这两种方法有何不同。请澄清。
答案 0 :(得分:10)
对x == true
和/或x == false
的评估取决于true
和false
的定义,这些定义可能不普遍相同。
(x)
和(!x)
仅根据x
的值进行评估,不依赖于任何平台/实现/标准特定定义。例如,如果(x)
具有非零值,则会评估x
以生成 TRUE 结果。
在C
中,根据C11
标准,stdbool.h
标题,章7.18
true
和false
的定义为
<强>真强>
扩展为整数常量1,
<强>假强>
扩展为整数常量0
因此,如果x
的值为2
x == true
将被评估为生成 FALSE 。 (x)
将生成 TRUE 。因此,为了生成健壮的代码并保持可移植性,使用后一种方法会更好。
答案 1 :(得分:0)
在C ++中,false为'0',其他任何内容都为真,但是当你比较'x == true'时,你实际上是在测试'x == 1'是否在某些情况下是正常但不是全部。
答案 2 :(得分:0)
C和C ++是不同的语言。
在C99或C11中,所有内容都可以用作测试,具有以下约定:
bool
(来自<stdbool.h>
)值false
被测试为false,否则应为true
并测试为true。int
的{{1}},long
,intptr_t
等等,只有在为0时才会被视为错误<stdint.h>
)为0.0,则测试为false;如果为非零数,则为true;对于double
,它是特定问题。请参阅Floating point guide NAN
且测试为真,则测试指针类型为false。我忘记了关于无效指针的标准说明(不是NULL
运算符或&
等一元地址的结果......)在C ++ 11中,您可以使用malloc
和使用bool
的显式一元operator bool
运算符显式转换为!
,因此事情要复杂得多。我相信(但我不确定)operator !
会在x == true
上使用转换为bool
运算符,至少如果该运算符是显式的。
我确信存在微妙的角落情况(在C中,指向某些现有函数的指针是真的,但我忘记了标准中关于指向函数的指针的说法...) 。在C ++中,这是一场噩梦。