Engineered bool 比较等于 true 和 false,为什么?

问题描述 投票:0回答:5

下面的示例可以编译,但输出相当奇怪:

#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

c++ boolean undefined-behavior
5个回答
11
投票

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

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

42) 以本国际标准描述为“未定义”的方式使用 bool 值,例如通过检查未初始化的自动变量的值,可能会导致其表现得既非 true 又非 false。

这对我来说并不完全清楚,但似乎回答了问题。


2
投票

覆盖

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


2
投票

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


2
投票

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

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

注释 42 说:

42) 使用布尔值的方式 本国际所描述的 标准为“未定义”,例如 检查一个的价值 未初始化的自动变量, 可能会导致它表现得好像 不真实也不虚假。


1
投票

我似乎无法在标准中找到任何内容来表明为什么会发生这种情况(很可能是我的错)——这确实包括 7vies 提供的参考,但其本身并没有多大帮助。这绝对是未定义的行为,但我无法解释 OP 观察到的具体行为

作为一个实际问题,我很惊讶输出是

true
true

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

false
false

在后一种情况下,发生的情况是:

  • 与布尔值
    true
    的比较由编译器实现,作为与
    0x01
    是否相等的测试,并且由于
    0xff != 0x01
    ,结果是
    false
  • 与布尔值
    false
    的比较也是如此,只是比较的值现在是
    0x00

我想不出任何实现细节会导致

false
在解释为
0xff
时与值
bool
进行比较。有人对此有什么想法吗?

© www.soinside.com 2019 - 2024. All rights reserved.