Mozilla C/C++编码风格

Mozilla C/C++ coding style

本文关键字:编码 风格 C++ Mozilla      更新时间:2023-10-16

今天我在浏览"Mozilla编码风格指南"时发现了一点我不确定。

下面的陈述是什么意思?

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

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

x == true和/或x == false的评估取决于truefalse的定义,这两个定义可能不完全相同。

CCD_ 11和CCD_ 12仅基于CCD_。例如,在x具有非零值的情况下,将对(x)进行评估以产生TRUE结果。

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

其扩展到整数常数1,

错误

它扩展到整数常数0

因此,在x具有值2的情况下

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

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

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

在C99或C11中,所有东西都可以用作测试,使用约定:

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

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

我确信有一些微妙的角落情况(在C中,指向某个现有函数的指针是真的,但我忘记了标准对指向函数的指针的一般规定…)。在C++中,这是一场噩梦。

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