Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Mozilla C/C++;编码风格_C++_C_If Statement_Boolean_Language Lawyer - Fatal编程技术网

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
    表达式中执行(如果到达了代码)。