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

运算符优先级导致输出不符,求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。

逐步骤正确解析

要搞懂结果差异,必须明确三个核心规则:

  1. Java操作数求值顺序是严格从左到右,与运算符优先级无关;
  2. 后置自增a++是先取当前值参与运算,运算后再将a自增1;
  3. 复合赋值*=的执行逻辑:先计算左操作数的初始值并保存,再计算右表达式结果,最后用保存的初始值与右结果运算,赋值给左操作数。

步骤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。

你的错误点总结

  1. 混淆了操作数求值顺序和运算符优先级:你误以为先计算乘法里的a++,再计算减法左边的a++,但实际是从左到右先算减法左边的a++(取值6);
  2. 错误理解复合赋值的逻辑:你认为用右表达式计算后的a值(8)参与乘法,但实际复合赋值会先保存左操作数的初始值(6),再用这个值与右结果运算。

内容的提问来源于stack exchange,提问作者Doyun Kim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:35:28