只需阅读内部大学线程:
#include <iostream>
using namespace std;
union zt
{
bool b;
int i;
};
int main()
{
zt w;
bool a,b;
a=1;
b=2;
cerr<<(bool)2<<static_cast<bool>(2)<<endl; //11
cerr<<a<<b<<(a==b)<<endl; //111
w.i=2;
int q=w.b;
cerr<<(bool)q<<q<<w.b<<((bool)((int)w.b))<<w.i<<(w.b==a)<<endl; //122220
cerr<<((w.b==a)?'T':'F')<<endl; //F
}
所以a
和b
都w.b
被声明为bool
。a
is assigned 1
,b
is assigned 2
,内部表示w.b
变为2
(使用 a union
)。
这样一来,所有的,将是,但和a
不会是相等b
的,所以这可能意味着宇宙被打破了()w.b
true
a
w.b
true!=true
我知道这个问题比实际问题更具理论性(清酒程序员不想更改 a 的内部表示bool
),但这里有一些问题:
- 这个可以吗?(这是用 g++ 4.3.3 测试的)我的意思是,编译器是否应该知道在布尔比较期间任何非零值都可能意味着真的?
- 您知道这种极端情况可能成为真正问题的任何情况吗?(例如,从流中加载二进制数据时)
编辑:
三件事:
bool
并且int
有不同的尺寸,没关系。但是如果我使用char
而不是int
. 还是什么时候sizeof(bool)==sizeof(int)
?如果可能,请回答我提出的两个问题。我实际上也对第二个问题的答案感兴趣,因为老实说,在嵌入式系统(可能是 8 位系统)中,这可能是一个真正的问题(或不是)。
新问题:这真的是未定义的行为吗?如果是,为什么?如果不是,为什么?规范中的布尔比较运算符没有任何假设吗?