C++ Mozilla C/C++;编码风格
今天,我正在浏览一篇文章,我发现了一个我不确定的观点 下面这句话是什么意思 不要比较C++ Mozilla C/C++;编码风格,c++,c,if-statement,boolean,language-lawyer,C++,C,If Statement,Boolean,Language Lawyer,今天,我正在浏览一篇文章,我发现了一个我不确定的观点 下面这句话是什么意思 不要比较x==true或x==false。改用(x)或(!x)x==true与不同 我不知道这两种方法有什么不同。请澄清。C++中的 < P>是 0 < /COD>,其他任何事情都是真的,但是当你比较x==true时,你实际上是在测试天气x==1,这在某些情况下是可以的,但不是所有情况下都可以。对x==true和/或x==false的评估取决于true和false的定义,这两个定义可能并不完全相同 (x)和(!x)仅基于
x==true
或x==false
。改用(x)
或(!x)
<事实上,如果(x),则code>x==true与不同
我不知道这两种方法有什么不同。请澄清。C++中的 < P>是<代码> 0 < /COD>,其他任何事情都是真的,但是当你比较x==true
时,你实际上是在测试天气x==1
,这在某些情况下是可以的,但不是所有情况下都可以。对x==true
和/或x==false
的评估取决于true
和false
的定义,这两个定义可能并不完全相同
(x)
和(!x)
仅基于x
的值进行评估,不依赖于任何平台/实施/标准特定定义。例如,(x)
将被评估,以在x
具有非零值的情况下产生真实结果
在C
中,根据C11
标准,stdbool.h
标题,第7.18章对true
和false
的定义如下:
正确
它展开为整数常量1
false
它展开为整数常量0
因此,如果x
具有值2
x==true
将被评估为产生FALSE
(x)
将生成TRUE
<> P> >为了生成健壮的代码,维护可移植性,最好使用后一种方法。 < P> C和C++是不同的语言。
在C99或C11中,任何东西都可以用作测试,但有以下约定:
如果bool
(来自
)值为false
,则测试为false,否则应为true
,并测试为true
整数类型(例如int
、long
、intptr\t
from
等)仅在为0时测试为false
浮点类型(例如,double
)如果为0.0,则测试为假;如果为非零数,则测试为真,因为这是一个特定问题。看
如果指针类型NULL
则测试为false,否则测试为true。我忘记了标准中关于无效指针的说明(不是&
运算符或malloc
等的一元地址的结果)
在C++11中,可以使用运算符bool
和显式一元数显式转换为bool
代码>运算符和运算符代码>所以事情要复杂得多。我相信(但我不确定)x==true
会在x
上使用转换为bool
运算符,至少如果该运算符是显式的
我确信存在一些微妙的情况(在C语言中,指向某个现有函数的指针是正确的,但我忘记了标准中关于指向函数的指针的一般说明…)。在C++中,它是一个噩梦。 C和C++是不同的语言,即使在那个方面。我相信你错了。考虑<代码> x/COD>是<代码>类< /代码>提供一些明确的<代码>操作符布尔O/COD>转换。此外, false < /Cord>在C++中不是<代码> 0 < /COD>。在某些情况下,它可能会转换为0
,但它不是0
。它真的说了“C/C++编码风格”吗?我会把它看作是一面巨大的红旗。例如,<代码>真< /代码>和<代码> false <代码>在两种语言中都不相同。为什么不给他们发电子邮件并问他们?@ JuangopangZa。“丹尼尔达拉那令人失望(虽然这些是我所看到的最不冒犯的C++编码准则,可能是因为它们的简洁性)。我可能会给他们发一条评论。谢谢你的回答。对无效指针的求值是未定义的,无论它在哪里执行,也可以在if
表达式中执行(如果到达了代码)。