我希望下面的代码产生相等性,但是bool值显示为不同。
#include <iostream>
union crazyBool
{
unsigned char uc;
bool b;
};
int main()
{
crazyBool a, b;
a.uc = 1;
b.uc = 5;
if(a.b == b.b)
{
std::cout << "==" << std::endl;
}
else
{
std::cout << "!=" << std::endl;
}
bool x, y;
void *xVP = &x, *yVP = &y;
unsigned char *xP = static_cast<unsigned char*>(xVP);
unsigned char *yP = static_cast<unsigned char*>(yVP);
(*xP) = (unsigned char)1;
(*yP) = (unsigned char)5;
if(x == y)
{
std::cout << "==" << std::endl;
}
else
{
std::cout << "!=" << std::endl;
}
return 0;
}
请注意,这里我们不仅要通过并集(被指出是未定义的)更改值,而且还要直接通过void指针访问内存。
如果您分配给工会的成员,则该成员将成为活动成员。
读取活动成员以外的任何成员都是未定义的行为,这意味着任何事情都可能发生。该规则有一些特定的例外情况,具体取决于编译器遵循的C ++标准版本。但这些例外均不适用于您的情况。
(一个例外是,如果联合具有多个类类型的成员,而这些类具有相同的初始成员,则可以通过联合的任何成员来读取这些共享的成员。)
编辑以解决问题:
该标准将bool定义为具有true
和false
,没有其他值。(C ++ 11,3.9.1 / 6)它从未定义在存储上复制其他位模式的含义(这就是您正在做的事情)。由于未定义,因此行为也未定义。
是的,将整数转换为bool时0会变为false,而其他任何条件都将变为true,但这仅是转换规则,而不是有关bool表示的声明。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句