为何两段C++位差异统计代码结果不同?求底层逻辑解析
问题解析:为什么不加括号的代码返回错误结果?
你的问题核心在于C++运算符的优先级与结合性,不加括号时编译器会按照预设的优先级解析表达式,导致判断逻辑完全偏离预期。
正确代码(返回4)
// returns 4 int bitDiff () { int a=10, b=20; int count=0; while(a || b) { if ((a&1) != (b&1)) count++; a=a>>1; b=b>>1; } return count; }
错误代码(返回2)
// returns 2 int bitDiff () { int a=10, b=20; int count=0; while(a || b) { if (a&1 != b&1) count++; a=a>>1; b=b>>1; } return count; }
底层逻辑解析
在C++的运算符优先级规则中:
- 相等运算符
!=的优先级高于按位与运算符& - 当表达式没有括号时,编译器会优先计算优先级更高的
!=,再计算&
你预期的表达式逻辑是「比较a和b的最低位是否不同」,也就是((a&1) != (b&1)),但不加括号时,编译器会把表达式解析为:
a & (1 != (b & 1))
我们手动对比两种表达式的每一步计算:
正确表达式的循环过程
- a=10(二进制1010), b=20(二进制10100) → 0 != 0 → 不计数,count=0
- a=5(0101), b=10(01010) →1 !=0 →计数,count=1
- a=2(0010), b=5(00101) →0 !=1 →计数,count=2
- a=1(0001), b=2(00010) →1 !=0 →计数,count=3
- a=0(0000), b=1(00001) →0 !=1 →计数,count=4
循环结束,返回4。
错误表达式的循环过程
- a=10, b=20 → b&1=0 →1!=0=1 →10&1=0 →结果0 →不计数,count=0
- a=5, b=10 →b&1=0 →1!=0=1 →5&1=1 →结果1 →计数,count=1
- a=2, b=5 →b&1=1 →1!=1=0 →2&0=0 →结果0 →不计数,count=1
- a=1, b=2 →b&1=0 →1!=0=1 →1&1=1 →结果1 →计数,count=2
- a=0, b=1 →b&1=1 →1!=1=0 →0&0=0 →结果0 →不计数,count=2
循环结束,返回2。
可以看到,错误的表达式解析直接改变了每一次循环的判断条件,最终导致计数结果错误。添加括号后,强制编译器按照你预期的顺序计算,就能得到正确结果。
内容的提问来源于stack exchange,提问作者Kamlesh Patel
相关产品推荐
相关产品推荐

