Mozilla C / C ++编码风格

时间:2015-03-24 09:32:36

标签: c++ c if-statement boolean language-lawyer

今天我经历了"Mozilla Coding Style Guideline",我找到了一个我不确定的观点。

以下陈述对他们意味着什么?

  

不要比较x == truex == false。请改用(x)(!x)。事实上,x == trueif (x)不同!

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

3 个答案:

答案 0 :(得分:10)

x == true和/或x == false的评估取决于truefalse的定义,这些定义可能普遍相同。

(x)(!x)仅根据x的值进行评估,不依赖于任何平台/实现/标准特定定义。例如,如果(x)具有非零值,则会评估x以生成 TRUE 结果。

C中,根据C11标准,stdbool.h标题,章7.18 truefalse的定义为

  

<强>真

     

扩展为整数常量1,

     

<强>假

     

扩展为整数常量0

因此,如果x的值为2

  • x == true将被评估为生成 FALSE
  • (x)将生成 TRUE

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

答案 1 :(得分:0)

在C ++中,false为'0',其他任何内容都为真,但是当你比较'x == true'时,你实际上是在测试'x == 1'是否在某些情况下是正常但不是全部。

答案 2 :(得分:0)

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

在C99或C11中,所有内容都可以用作测试,具有以下约定:

  1. bool(来自<stdbool.h>)值false被测试为false,否则应为true并测试为true。
  2. 整数类型(例如来自int的{​​{1}},longintptr_t等等,只有在为0时才会被视为错误
  3. 如果浮点类型(例如<stdint.h>)为0.0,则测试为false;如果为非零数,则为true;对于double,它是特定问题。请参阅Floating point guide
  4. 如果指针类型为NAN且测试为真,则测试指针类型为false。我忘记了关于无效指针的标准说明(不是NULL运算符或&等一元地址的结果......)
  5. 在C ++ 11中,您可以使用malloc和使用bool的显式一元operator bool运算符显式转换为!,因此事情要复杂得多。我相信(但我不确定)operator !会在x == true上使用转换为bool运算符,至少如果该运算符是显式的。

    我确信存在微妙的角落情况(在C中,指向某些现有函数的指针是真的,但我忘记了标准中关于指向函数的指针的说法...) 。在C ++中,这是一场噩梦。