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
的计算取决于 true
和 false
的定义,这可能 而不是 普遍相同。
(x)
和 (!x)
仅根据 x
的值进行评估,不依赖于任何平台/实现/标准特定定义。例如,如果 x
具有 non-zero[=48=,(x)
将被评估为产生 TRUE 结果]值。
在C
中,根据C11
标准,stdbool.h
header,第7.18
章true
和[=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中,一切都可以作为测试,约定:
- 一个
bool
(来自<stdbool.h>
)值false
被测试为假,否则它应该是true
并被测试为真。
- 整数类型(例如
int
、long
、<stdint.h>
中的 intptr_t
等)只有在为 0
- 如果浮点类型(例如
double
)为 0.0,则测试为假,如果它为非零数,则测试为真。对于 NAN
,这是一个特定问题。参见 Floating point guide
- 如果
NULL
指针类型被测试为假,否则被测试为真。我忘记了标准关于无效指针的说法(不是 &
运算符或 malloc
等的一元地址的结果...)
在 C++11 中,您可以使用 operator bool
显式转换为 bool
,使用 operator !
显式转换为 !
运算符,因此事情要复杂得多。我相信(但我不确定)x == true
会在 x
上使用到 bool
运算符的转换,至少如果该运算符是显式的。
我确定存在细微的极端情况(在 C 中,指向某些 现有 函数的指针是正确的,但我忘记了标准中关于函数指针的说法一般的...)。在 C++ 中,这是一场噩梦。
今天我正在浏览"Mozilla Coding Style Guideline",我发现了一个我不确定的点。
下面的语句是什么意思?
Do not compare
x == true
orx == false
. Use(x)
or(!x)
instead.x == true
, in fact, is different fromif (x)
!
我不确定这两种方法有何不同。请澄清。
在 C++ 中,false 是 0
,其他任何东西都是 true,但是当您比较 x == true
时,您实际上是在测试天气 x == 1
,这在某些情况下是可以的,但不是全部。
x == true
and/or x == false
的计算取决于 true
和 false
的定义,这可能 而不是 普遍相同。
(x)
和 (!x)
仅根据 x
的值进行评估,不依赖于任何平台/实现/标准特定定义。例如,如果 x
具有 non-zero[=48=,(x)
将被评估为产生 TRUE 结果]值。
在C
中,根据C11
标准,stdbool.h
header,第7.18
章true
和[=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中,一切都可以作为测试,约定:
- 一个
bool
(来自<stdbool.h>
)值false
被测试为假,否则它应该是true
并被测试为真。 - 整数类型(例如
int
、long
、<stdint.h>
中的intptr_t
等)只有在为 0 - 如果浮点类型(例如
double
)为 0.0,则测试为假,如果它为非零数,则测试为真。对于NAN
,这是一个特定问题。参见 Floating point guide - 如果
NULL
指针类型被测试为假,否则被测试为真。我忘记了标准关于无效指针的说法(不是&
运算符或malloc
等的一元地址的结果...)
在 C++11 中,您可以使用 operator bool
显式转换为 bool
,使用 operator !
显式转换为 !
运算符,因此事情要复杂得多。我相信(但我不确定)x == true
会在 x
上使用到 bool
运算符的转换,至少如果该运算符是显式的。
我确定存在细微的极端情况(在 C 中,指向某些 现有 函数的指针是正确的,但我忘记了标准中关于函数指针的说法一般的...)。在 C++ 中,这是一场噩梦。