示例波纹管编译,但输出相当奇怪:
#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
答案 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
进行比较的实现细节。有人对此有任何想法吗?