C语言中x && (~x)表达式结果存疑:实际编译与教授结论为何不同?
问题解答:x && (~x) 结果争议的原因分析
这绝对不是编译器问题,核心是对C语言运算符的概念混淆:
- 教授错误将逻辑与运算符
&&当成了按位与运算符&,二者规则完全不同:- 逻辑与
&&:仅判断操作数是否为非0,只要两边都为非0值,结果就为1(布尔真);任意一边为0则结果为0。 - 按位与
&:对两个数的每一位进行按位运算,对应位都为1时结果位才是1,否则为0。
- 逻辑与
代码场景的具体分析
short x = 0xFFF0:该值是十进制的-16,属于非0值。~x对x按位取反:16位的0xFFF0二进制为1111111111110000,取反后得到0000000000001111(即0x000F),同样是非0值。x && (~x)是两个非0值做逻辑与运算,根据规则结果为1,和实际编译运行的输出一致。
如果要得到教授预期的0结果,需将运算符改为按位与&,修改后的代码如下:
int main() { short x = 0xFFF0; printf("%X\n", x & (~x)); return 0; }
此时0xFFF0 & 0x000F的每一位对应运算后均为0,输出结果为0。
内容的提问来源于stack exchange,提问作者Zayed Aldhaheri
相关产品推荐
相关产品推荐

