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

Java运算符执行顺序疑问:赋值语句中索引与自增的执行逻辑

Java中赋值表达式与自增操作的执行逻辑解析

要理解你的代码运行结果,核心是掌握Java中赋值表达式的求值顺序以及自增运算符的行为,以下分步骤解析:

一、简化示例:a[i] = ++i的执行过程

代码:

int   i = 0;
int[] a = {10, 20};

a[i] = ++i;
System.out.println(Arrays.toString(a)); // 输出[1, 20]

执行步骤(严格遵循Java语言规范):

Java中赋值表达式E1 = E2的求值顺序是先计算左操作数E1,再计算右操作数E2,最后完成赋值:

  1. 计算左操作数a[i]:此时i的值为0,因此确定要修改的是数组的索引0位置(即a[0])。
  2. 计算右操作数++i:++i是前置自增,先将i的值从0改为1,再返回自增后的结果1。
  3. 完成赋值:将右操作数的结果1赋值给左操作数指向的a[0],最终数组变为[1, 20]。

你之前误以为先执行右侧的++i再确定数组下标,这是错误的——Java始终先确定赋值的目标位置(左操作数),再计算要赋的值(右操作数)。

二、复杂示例:a[++i] = a[i++] = a[++i] = ++i的执行过程

代码:

int   i = 0;
int[] a = {10, 20, 30, 40, 50, 60};

a[++i] = a[i++] = a[++i] = ++i;
System.out.println(Arrays.toString(a)); // 输出[10, 4, 30, 4, 50, 60]

关键前提:赋值运算符的右结合性

Java的赋值运算符是右结合的,因此链式赋值E1 = E2 = E3 = E4等价于E1 = (E2 = (E3 = E4)),但每个嵌套的赋值表达式依然遵循「先算左操作数,再算右操作数」的规则。

完整执行步骤(初始i=0,数组a=[10,20,30,40,50,60]):

  1. 处理最外层赋值a[++i] = (...):

    • 先计算左操作数a[++i]:执行前置自增++i,i从0变为1,确定目标位置是a[1]。
    • 接下来计算右侧的嵌套表达式a[i++] = (a[++i] = ++i)。
  2. 处理中间层赋值a[i++] = (...):

    • 先计算左操作数a[i++]:此时i=1,执行后置自增i++,先使用当前值1作为数组下标(目标位置a[1]),再将i变为2。
    • 接下来计算右侧的内层表达式a[++i] = ++i。
  3. 处理最内层赋值a[++i] = ++i:

    • 先计算左操作数a[++i]:执行前置自增++i,i从2变为3,确定目标位置是a[3]。
    • 计算右操作数++i:执行前置自增++i,i从3变为4,返回结果4。
    • 赋值:将4赋给a[3],数组变为[10,20,30,4,50,60],该表达式返回值为4。
  4. 回到中间层赋值:

    • 将内层表达式返回的4赋给之前确定的a[1],数组变为[10,4,30,4,50,60],该表达式返回值为4。
  5. 回到最外层赋值:

    • 将中间层表达式返回的4赋给之前确定的a[1](此时a[1]已经是4,无变化)。

最终数组即为[10,4,30,4,50,60],与运行结果一致。

三、核心规则总结

  • 赋值表达式E1 = E2:先计算E1(确定赋值目标),再计算E2(获取赋值内容),最后完成赋值。
  • 自增运算符:
    • ++i(前置):先自增变量值,再返回自增后的值。
    • i++(后置):先返回变量当前值,再自增变量值。
  • 链式赋值的右结合性:嵌套赋值从最内层开始完成赋值,但每个嵌套赋值的左操作数会在其右操作数计算前被求值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 22:54:52