运算符优先级导致输出不符,求Java代码执行步骤解析
解析Java代码运算结果差异:为什么是-174而不是-184?
问题代码
int a = 6; int b = 5; System.out.print(a *= a++ - (a++) * b);
你的思路误区
我认为(a++)取值为6,按运算顺序计算7 - 6 * 5 = -23,此时a应为8,8 *= -23得到-184。
逐步骤正确解析
要搞懂结果差异,必须明确三个核心规则:
- Java操作数求值顺序是严格从左到右,与运算符优先级无关;
- 后置自增
a++是先取当前值参与运算,运算后再将a自增1; - 复合赋值
*=的执行逻辑:先计算左操作数的初始值并保存,再计算右表达式结果,最后用保存的初始值与右结果运算,赋值给左操作数。
步骤1:初始状态
a=6,b=5
步骤2:计算右表达式a++ - (a++) * b
运算符优先级:乘法*高于减法-,但操作数求值严格从左到右:
- 先求值减法左操作数
a++:取当前a的值6,随后a自增为7; - 再求值乘法部分
(a++) * b:- 先取乘法左操作数
a++的当前值7,随后a自增为8; - 乘法运算:
7 * 5 = 35;
- 先取乘法左操作数
- 最后执行减法:
6 - 35 = -29(右表达式结果为-29)
步骤3:执行复合赋值a *= -29
按照复合赋值规则:
- 先保存左操作数a的初始值6(这个值是在计算右表达式之前就确定的);
- 计算
6 * (-29) = -174; - 将结果赋值给a,最终a的值为-174。
你的错误点总结
- 混淆了操作数求值顺序和运算符优先级:你误以为先计算乘法里的
a++,再计算减法左边的a++,但实际是从左到右先算减法左边的a++(取值6); - 错误理解复合赋值的逻辑:你认为用右表达式计算后的a值(8)参与乘法,但实际复合赋值会先保存左操作数的初始值(6),再用这个值与右结果运算。
内容的提问来源于stack exchange,提问作者Doyun Kim
相关产品推荐
相关产品推荐

