有趣的事情!以博尔值运作

时间:2011-02-23 08:12:43

标签: c++

以下是一个代码段

#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设置时,是否会触发复制构造函数?但为什么不同?

1 个答案:

答案 0 :(得分:8)

bool只能取值truefalse

当您执行!(*pc)时,您将获得未定义的行为,因为您告诉编译器在!对象上执行bool实际上{{1}指向pc对象。 (从charchar*的C样式转换是危险的,即使未定义的行为仅在应用bool*运算符时发生。)< / p>

!char(例如int)转换为0xFF时,所有非零值都会转换为true,零值将转换为false