public class Conversions {
public static void main(String[] args) {
int index = 3;
int[] arr = new int[] { 10, 20, 30, 40};
arr[index] = index = 2; //(1)
System.out.println("" + arr[3] + " " + arr[2]);
}
}
我有这个,它给出了:
2 30
我希望它能给出
40 2
At(1)为什么赋值中的索引值没有变为2(并保持为3)。 ?
答案 0 :(得分:11)
Java语言规范(JLS)right-associativity隐含的=
section 15.26意味着您的表达式可以表示为tree,因此:
=
+------+-------+
| |
arr[index] =
+----+----+
| |
index 2
但是,section 15.7表示:
Java编程语言保证运算符的操作数似乎以特定的评估顺序进行评估,即从左到右。
因此,arr[index]
在 index = 2
之前评估,即之前更新index
的值。
显然,你永远不应该编写依赖于这个事实的代码,因为它依赖于几乎没有读者理解的规则。
答案 1 :(得分:5)
Java language Specification: 15.26.1. Simple Assignment Operator =
如果左侧操作数是数组访问表达式(第15.13节), 可能包含在一对或多对括号中,然后:
首先,计算左侧操作数数组访问表达式的数组引用子表达式。如果此评估完成 然后突然完成赋值表达式 同样的原因;索引子表达式(左侧操作数数组) 访问表达式)和右侧操作数未被评估和 没有任何转让。
否则,将评估左侧操作数数组访问表达式的索引子表达式。如果此评估完成 然后突然完成赋值表达式 同样的原因和右手操作数没有评估,没有 分配发生。
否则,评估右侧操作数。如果此评估突然完成,则赋值表达式完成 突然出于同样的原因而且没有任何转让。
[...](进一步说明了步骤)
正如您所见,索引在作业的右侧之前进行了评估。
答案 2 :(得分:1)
arr[index]
)。