You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何两段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))

我们手动对比两种表达式的每一步计算:

正确表达式的循环过程

  1. a=10(二进制1010), b=20(二进制10100) → 0 != 0 → 不计数,count=0
  2. a=5(0101), b=10(01010) →1 !=0 →计数,count=1
  3. a=2(0010), b=5(00101) →0 !=1 →计数,count=2
  4. a=1(0001), b=2(00010) →1 !=0 →计数,count=3
  5. a=0(0000), b=1(00001) →0 !=1 →计数,count=4
    循环结束,返回4。

错误表达式的循环过程

  1. a=10, b=20 → b&1=0 →1!=0=1 →10&1=0 →结果0 →不计数,count=0
  2. a=5, b=10 →b&1=0 →1!=0=1 →5&1=1 →结果1 →计数,count=1
  3. a=2, b=5 →b&1=1 →1!=1=0 →2&0=0 →结果0 →不计数,count=1
  4. a=1, b=2 →b&1=0 →1!=0=1 →1&1=1 →结果1 →计数,count=2
  5. a=0, b=1 →b&1=1 →1!=1=0 →0&0=0 →结果0 →不计数,count=2
    循环结束,返回2。

可以看到,错误的表达式解析直接改变了每一次循环的判断条件,最终导致计数结果错误。添加括号后,强制编译器按照你预期的顺序计算,就能得到正确结果。

内容的提问来源于stack exchange,提问作者Kamlesh Patel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:20:16