Java混合使用+=与自增运算符计算结果不符问题排查
错误点
你推导的核心问题是对Java复合赋值运算符+=的求值逻辑理解错了。a += 表达式的执行顺序不是先把右边全算完再拿当时的a去加,而是第一步就会先把左边a的当前值存下来,再去算右边整个表达式的结果,最后把存好的初始a值和右边结果相加,赋值给a。你最后用右边运算完a变成7的值去加17,当然就错了。
正确推导过程
- 初始值:
a = 5 - 执行
a += 5 + (++a) + (a++)第一步:先提取+=左侧a的初始值,存为5(这步是你推导时完全遗漏的步骤) - 计算右侧整个表达式
5 + (++a) + (a++)的值:- 计算
++a:先对a自增到6,取当前值6,此时a = 6 - 计算
a++:先取当前a的值6,再对a自增到7,此时a =7 - 右侧表达式最终结果:
5 + 6 + 6 = 17
- 计算
- 执行
+=最终赋值:用最开始存储的左侧a的初始值5+ 右侧结果17=22,赋值给a,最终a的值为22
补充说明
运算符优先级规则只是决定运算的结合顺序,不会改变+=这类复合赋值运算符本身的求值逻辑:所有复合赋值运算符都是先提取左值存储,再计算右值,最后合并赋值,不会用右值计算过程中变更的左值覆盖最开始存储的初始左值。
内容的提问来源于stack exchange,提问作者PRAKHAR ANAND
相关产品推荐
相关产品推荐

