C语言中~(true)的取值及代码逻辑异常原因咨询
问题解释:为什么
~abc会导致if分支执行而!abc符合预期 先看你的代码:
// Write C code here bool abc = true; bool cba = true; bool bac = ~abc; if(cba && bac) { printf("\nYES! %d", bac); } else { printf("\nNO! %d", bac); } return 0;
核心原因是按位取反~和逻辑非!的本质完全不同,结合C语言中bool类型的特性就会出现这个现象:
- 首先明确:C99的
bool是_Bool的别名,true被定义为1,false为0。但_Bool类型有个规则:任何非0值赋值给它,都会被自动转成1(也就是true)。 - 执行
~abc时,abc是bool类型的1,会先触发整数提升,变成int类型的1(32位系统里是0x00000001)。按位取反后得到0xFFFFFFFE,这个值是-2(补码表示),属于非0值。把它赋值给bool类型的bac时,就会被转成1(true)。 - 此时
cba是true,bac也是true,cba && bac结果为true,自然进入if分支打印YES。
而用!abc时,逻辑非操作直接对abc的逻辑值取反:true的逻辑非是false(0),赋值给bac后就是false,cba && bac结果为false,所以走else分支,符合预期。
内容的提问来源于stack exchange,提问作者user2706764
相关产品推荐
相关产品推荐

