工程bool比较真假两者,为什么?

时间:2010-12-23 12:59:47

标签: c++

示例波纹管编译,但输出相当奇怪:

#include <iostream>
#include <cstring>

struct A
{
    int a;
    char b;
    bool c;
};

int main()
{
    A v;
    std::memset( &v, 0xff, sizeof(v) );

    std::cout << std::boolalpha << ( true == v.c ) << std::endl;
    std::cout << std::boolalpha << ( false == v.c ) << std::endl;
}

输出是:

true
true

有人可以解释原因吗?

如果重要,我使用的是g ++ 4.3.0

5 个答案:

答案 0 :(得分:11)

在C ++标准第3.9.1节“基本类型”中找到了这一点(注意魔术脚注42):

6. Values of type bool are either true or false. 42)
  

42)以本国际标准所描述的方式将bool值用作“未定义”,例如通过检查未初始化的自动变量的值,可能会使其表现为既不是真也不是假。< / p>

这对我来说并不是很清楚,但似乎回答了这个问题。

答案 1 :(得分:2)

覆盖v使用的内存位置的结果是undefined behaviour。 根据标准(包括你的电脑飞走和吃早餐),一切都可能发生。

答案 2 :(得分:2)

一个布尔值,其内存设置为一个或零的值,具有未定义的行为。

答案 3 :(得分:2)

我找到了答案。 3.9.1-6说:

  

bool类型的值为true或   false.42)[注:没有签名,   无符号,短或长bool类型或   值。 ]如下所述,布尔   值表现为整数类型。   bool类型的值参与   整体促销(4.5)。

注释42说:

  

42)以某种方式使用bool值   这个国际描述   标准为“未定义”,例如by   检查一个人的价值   未初始化的自动变量,   可能会使它表现得像它一样   既不真实也不虚假。

答案 4 :(得分:1)

我似乎无法找到标准中的任何内容,指出为什么会发生这种情况(最可能是我的错) - 这确实包括7vies提供的参考,这本身并不是很有用。它绝对是未定义的行为,但我无法解释 OP 所观察到的特定行为。

实际上,我很惊讶输出是

true
true

使用VS2010,输出更容易解释:

false
false

在后一种情况下,会发生什么:

  • 与布尔true的比较由编译器实现为与0x01相等的测试,自0xff != 0x01以来结果为false
  • 与布尔false的比较相同,只有与之比较的值现在为0x00

在解释为false时,我无法想到任何会导致0xff与值bool进行比较的实现细节。有人对此有任何想法吗?