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,最后完成赋值:
- 计算左操作数
a[i]:此时i的值为0,因此确定要修改的是数组的索引0位置(即a[0])。 - 计算右操作数
++i:++i是前置自增,先将i的值从0改为1,再返回自增后的结果1。 - 完成赋值:将右操作数的结果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]):
处理最外层赋值
a[++i] = (...):- 先计算左操作数
a[++i]:执行前置自增++i,i从0变为1,确定目标位置是a[1]。 - 接下来计算右侧的嵌套表达式
a[i++] = (a[++i] = ++i)。
- 先计算左操作数
处理中间层赋值
a[i++] = (...):- 先计算左操作数
a[i++]:此时i=1,执行后置自增i++,先使用当前值1作为数组下标(目标位置a[1]),再将i变为2。 - 接下来计算右侧的内层表达式
a[++i] = ++i。
- 先计算左操作数
处理最内层赋值
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赋给之前确定的
a[1],数组变为[10,4,30,4,50,60],该表达式返回值为4。
- 将内层表达式返回的4赋给之前确定的
回到最外层赋值:
- 将中间层表达式返回的4赋给之前确定的
a[1](此时a[1]已经是4,无变化)。
- 将中间层表达式返回的4赋给之前确定的
最终数组即为[10,4,30,4,50,60],与运行结果一致。
三、核心规则总结
- 赋值表达式
E1 = E2:先计算E1(确定赋值目标),再计算E2(获取赋值内容),最后完成赋值。 - 自增运算符:
++i(前置):先自增变量值,再返回自增后的值。i++(后置):先返回变量当前值,再自增变量值。
- 链式赋值的右结合性:嵌套赋值从最内层开始完成赋值,但每个嵌套赋值的左操作数会在其右操作数计算前被求值。
内容的提问来源于stack exchange,提问作者Wolf359
相关产品推荐
相关产品推荐

