以下是一个代码段
#define T 0xFF
using namespace std;
int main(void) {
char c = T;
bool *pc = (bool *)(&c);
bool nc = !(*pc);
cout << "print: " << hex << nc << endl;
nc = T;
cout << "print: " << hex << nc << endl;
nc = c;
cout << "print: " << hex << nc << endl;
}
结果是
print: fe
print: 1
print: 1
如果使用值0xFF将char转换为bool,则bool值为1.
但是当类型转换为指向bool指针的char指针时,0xFF变为0xFE,只有最后一位被翻转!操作
似乎gcc假设bool为0或1,如果没有调用bool对象的构造函数,它只会将内存解释为包含bool并翻转最低位。
但是当bool由char设置时,是否会触发复制构造函数?但为什么不同?
答案 0 :(得分:8)
bool
只能取值true
和false
。
当您执行!(*pc)
时,您将获得未定义的行为,因为您告诉编译器在!
对象上执行bool
实际上{{1}指向pc
对象。 (从char
到char*
的C样式转换是危险的,即使未定义的行为仅在应用bool*
运算符时发生。)< / p>
将!
或char
(例如int
)转换为0xFF
时,所有非零值都会转换为true,零值将转换为false