首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有趣的事情!布尔值中的运算

问有趣的事情!布尔值中的运算
EN

Stack Overflow用户
提问于 2011-02-23 16:12:43
回答 1查看 308关注 0票数 2

下面是一个代码片段

代码语言:javascript
复制
#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;
}

结果是

代码语言:javascript
复制
print: fe
print: 1
print: 1

如果type使用值0xFF将字符强制转换为布尔值,则布尔值为1。

但当type将字符指针转换为布尔指针时,0xFF变为0xFE,只有最后一位被翻转!操作。

似乎gcc假设布尔值为0或1,如果不调用布尔值对象的构造函数,它将仅将内存解释为包含布尔值并翻转最低有效位。

但是当bool由char设置时,它会触发复制构造器吗?但为什么会不同呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-23 16:17:00

bool只能接受true和false的值。

当您执行!(*pc)时,您会得到未定义的行为,因为您告诉编译器在bool对象上执行!,而实际上pc指向的是char对象。(从char*到bool*的C样式转换是危险的,即使未定义的行为仅在应用!运算符时发生。)

当您将char或int (例如0xFF)转换为bool时,所有非零值都将转换为true,而零值将转换为false。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5088414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档