【问题标题】:Mozilla C/C++ coding styleMozilla C/C++ 编码风格
【发布时间】:2015-05-27 13:18:56
【问题描述】:

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

下面的语句是什么意思?

不要比较 x == truex == false。请改用(x)(!x)x == true,其实和if (x)不一样!

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

【问题讨论】:

  • 真的是“C/C++ 编码风格”吗?我认为这是一个很大的危险信号。例如,truefalse 在两种语言中都不相同。
  • 你为什么不给他们发邮件问问他们?
  • @juanchopanza 他们do.
  • @DanielDaranas 这很令人失望(尽管这些是我见过的最不冒犯性的 C++ 编码指南,可能是因为它们很简洁。)我可能会给他们发评论。

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


【解决方案1】:

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

【讨论】:

  • C 和 C++ 是不同的语言,即使在这方面也是如此。
  • 我相信你错了。将x 视为class 的一个实例,提供一些显式 operator bool 转换。
  • 另外,false 在 C++ 中不是 0。在某些情况下它可能会转换为0,但不是0
【解决方案2】:

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

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

【讨论】:

  • 感谢您的出色回答。
【解决方案3】:

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

在 C99 或 C11 中,一切都可以用作测试,具有以下约定:

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

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

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

【讨论】:

  • 对无效指针的求值是未定义的,无论它在哪里完成,也在 if 表达式中(如果到达代码)。
猜你喜欢
  • 1970-01-01
  • 2010-10-20
  • 2010-12-17
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 2013-02-20
相关资源
最近更新 更多