Java中x += y与x = x + y在特定位运算场景下结果为何不同?
Why
x += y and x = x + y Behave Differently in This Java Bitwise Scenario? 嘿,这个问题的关键其实不是类型转换,而是容易被忽略的运算符优先级!你之前查到的“仅当操作数类型不同时二者不等价”的结论没错,但这次的差异完全是运算顺序导致的。
咱们来拆解两个表达式的执行逻辑:
n = n + 0&1的实际执行逻辑
Java里加法运算符+的优先级高于按位与运算符&,所以这个表达式会被Java解析成:
n = (n + 0) & 1;
你的初始n=43261596是偶数,二进制末位为0,和1做按位与运算后结果自然是0,这就是为什么执行后n变成了0。
n += 0&1的实际执行逻辑
复合赋值运算符+=的优先级是所有运算符里最低的之一,而且它的计算规则是:先完整计算右侧的整个表达式,再和左侧变量进行运算。也就是说,这个表达式等价于:
n = n + (0 & 1);
0&1的结果是0,所以最终就是n = n + 0,结果和原n完全一致。
如果把第一个表达式手动加上括号强制改变运算顺序:
n = n + (0&1);
你会发现它的结果就和n += 0&1完全相同了。
内容的提问来源于stack exchange,提问作者Chen Xie
相关产品推荐
相关产品推荐

