Mozilla C/C++ 编码风格

Mozilla C/C++ coding style

今天我正在浏览"Mozilla Coding Style Guideline",我发现了一个我不确定的点。

下面的语句是什么意思?

Do not compare x == true or x == false. Use (x) or (!x) instead. x == true, in fact, is different from if (x)!

我不确定这两种方法有何不同。请澄清。

在 C++ 中,false 是 0,其他任何东西都是 true,但是当您比较 x == true 时,您实际上是在测试天气 x == 1,这在某些情况下是可以的,但不是全部。

x == true and/or x == false 的计算取决于 truefalse 的定义,这可能 而不是 普遍相同。

(x)(!x) 仅根据 x 的值进行评估,不依赖于任何平台/实现/标准特定定义。例如,如果 x 具有 non-zero[=48=,(x) 将被评估为产生 TRUE 结果]值。

C中,根据C11标准,stdbool.hheader,第7.18true和[=13的定义=] 是

true

which expands to the integer constant 1,

false

which expands to the integer constant 0

所以,如果 x 的值为 2

  • x == true 将被计算为 FALSE.
  • (x) 将产生 TRUE.

因此,要生成健壮的代码并保持可移植性,最好使用后一种方法。

C 和 C++ 是不同的语言。

在C99或C11中,一切都可以作为测试,约定:​​

  1. 一个bool(来自<stdbool.h>)值false被测试为假,否则它应该是true并被测试为真。
  2. 整数类型(例如 intlong<stdint.h> 中的 intptr_t 等)只有在为 0
  3. 如果浮点类型(例如 double)为 0.0,则测试为假,如果它为非零数,则测试为真。对于 NAN,这是一个特定问题。参见 Floating point guide
  4. 如果 NULL 指针类型被测试为假,否则被测试为真。我忘记了标准关于无效指针的说法(不是 & 运算符或 malloc 等的一元地址的结果...)

在 C++11 中,您可以使用 operator bool 显式转换为 bool,使用 operator ! 显式转换为 ! 运算符,因此事情要复杂得多。我相信(但我不确定)x == true 会在 x 上使用到 bool 运算符的转换,至少如果该运算符是显式的。

我确定存在细微的极端情况(在 C 中,指向某些 现有 函数的指针是正确的,但我忘记了标准中关于函数指针的说法一般的...)。在 C++ 中,这是一场噩梦。