下面的示例可以编译,但输出相当奇怪:
#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++ 标准第 3.9.1 节“基本类型”中找到了这一点(注意神奇的脚注 42):
6. Values of type bool are either true or false. 42)
42) 以本国际标准描述为“未定义”的方式使用 bool 值,例如通过检查未初始化的自动变量的值,可能会导致其表现得既非 true 又非 false。
这对我来说并不完全清楚,但似乎回答了问题。
内存设置为非一或非零的布尔值具有未定义的行为。
我想我找到了答案。 3.9.1-6 说:
bool 类型的值为 true 或 false.42) [注:没有签名, 无符号、短或长布尔类型或 价值观。 ] 如下所述,bool 值表现为整数类型。 bool 类型的值参与 积分促销(4.5)。
注释 42 说:
42) 使用布尔值的方式 本国际所描述的 标准为“未定义”,例如 检查一个的价值 未初始化的自动变量, 可能会导致它表现得好像 不真实也不虚假。
我似乎无法在标准中找到任何内容来表明为什么会发生这种情况(很可能是我的错)——这确实包括 7vies 提供的参考,但其本身并没有多大帮助。这绝对是未定义的行为,但我无法解释 OP 观察到的具体行为。
作为一个实际问题,我很惊讶输出是
true
true
使用VS2010,输出更容易解释:
false
false
在后一种情况下,发生的情况是:
true
的比较由编译器实现,作为与 0x01
是否相等的测试,并且由于 0xff != 0x01
,结果是 false
。false
的比较也是如此,只是比较的值现在是0x00
。我想不出任何实现细节会导致
false
在解释为 0xff
时与值 bool
进行比较。有人对此有什么想法吗?