下面是一个代码片段
#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如果type使用值0xFF将字符强制转换为布尔值,则布尔值为1。
但当type将字符指针转换为布尔指针时,0xFF变为0xFE,只有最后一位被翻转!操作。
似乎gcc假设布尔值为0或1,如果不调用布尔值对象的构造函数,它将仅将内存解释为包含布尔值并翻转最低有效位。
但是当bool由char设置时,它会触发复制构造器吗?但为什么会不同呢?
发布于 2011-02-23 16:17:00
bool只能接受true和false的值。
当您执行!(*pc)时,您会得到未定义的行为,因为您告诉编译器在bool对象上执行!,而实际上pc指向的是char对象。(从char*到bool*的C样式转换是危险的,即使未定义的行为仅在应用!运算符时发生。)
当您将char或int (例如0xFF)转换为bool时,所有非零值都将转换为true,而零值将转换为false。
https://stackoverflow.com/questions/5088414
复制相似问题