在一行中使用两个赋值操作符的时候有什么操作的顺序?
public static void main(String[] args){
int i = 0;
int[] a = {3, 6};
a[i] = i = 9; // this line in particular
System.out.println(i + " " + a[0] + " " + a[1]);
}
编辑:谢谢你的职位。 我得到=需要从正确的价值观,但是当我编译此,我得到:
9 9 6
我以为它会一直和ArrayOutOfBounds例外,但它赋予“A [1]”它的移动之前在9是否只是做了数组?
=
被解析为右结合的,但评价的顺序是左到右。
所以:语句被分析为a[i] = (i = 9)
然而,表达i
在a[i]
的右手侧(前计算i = 9
)中,当i
仍然是0
。
它的类似等价的:
int[] #0 = a;
int #1 = i;
int #2 = 9;
i = #2;
#0[#1] = #2;
按规格:
- http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html
15.26赋值运算符有12个赋值运算符; 所有在语法上右结合(他们组从右到左)。 因此,A = B = C是指=(B = C),其分配C到B的值,然后分配的b到a的值。
所以, a[i] = i = 9;
是一样的i = 9; a[i] = i;
i = 9; a[i] = i;
编辑
其实,事实并非如此。 样品测试类:
import java.util.Arrays;
public class Mkt {
public static void main(String[] args) {
int[] a = new int[10];
int i = 5;
a[i] = i = 9;
System.out.println(Arrays.toString(a));
}
}
样品运行:
$ javac Mkt.java && java Mkt
[0, 0, 0, 0, 0, 9, 0, 0, 0, 0]
请参考对方的回答以获取更多信息。 基本上:
我复制第二段这是非常有启发性在这里 - 很少是否有意义编写代码的混乱这样的。
我也觉得这值得一试。
如果我没有记错,=运算符是右关联; 所以我将首先分配,则[i]中。
该=
运算符是右结合(如其他已经说过)。 这可以用这个测试来证明很容易:
int i = 2;
int j = 3;
int x = i = j;
System.out.println(x); // This prints out 3.
这适用于所有类型的对象和原语。
我听到这个问题的方法称作是“双重任务”,因为,使用上面的例子,你要分配的值j
这两个i
和x
。
文章来源: Java - Order of Operations - Using Two Assignment Operators in a Single Line