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