爪哇 - 操作顺序 - 在一行中使用两个赋值运算符爪哇 - 操作顺序 - 在一行中使用两个赋值运算符

2019-05-12 07:15发布

在一行中使用两个赋值操作符的时候有什么操作的顺序?

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是否只是做了数组?

Answer 1:

=被解析为右结合的,但评价的顺序是左到右。

所以:语句被分析为a[i] = (i = 9) 然而,表达ia[i]的右手侧(前计算i = 9 )中,当i仍然是0

它的类似等价的:

int[] #0 = a;
int #1 = i;
int #2 = 9;
i = #2;
#0[#1] = #2;


Answer 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]

请参考对方的回答以获取更多信息。 基本上:

  • a[i] = i = 9是相同的a[i] = (i = 9)=是右结合
  • 然而, 操作数的评价是左到右,按这个 :

    15.7。 评估订单

    Java编程语言可以保证运营商的操作数出现在一个特定的评估顺序进行评价,即,由左到右。

    建议代码不是关键依赖于本规范。 代码通常是更清楚当每个表达式包含至多一个副作用,作为其最外的操作,并且当代码不依赖于准确哪个异常发生作为表达式的左到右的评价的结果。

我复制第二段这是非常有启发性在这里 - 很少是否有意义编写代码的混乱这样的。

我也觉得这值得一试。



Answer 3:

如果我没有记错,=运算符是右关联; 所以我将首先分配,则[i]中。



Answer 4:

=运算符是右结合(如其他已经说过)。 这可以用这个测试来证明很容易:

int i = 2;
int j = 3;
int x = i = j;
System.out.println(x); // This prints out 3.

这适用于所有类型的对象和原语。

我听到这个问题的方法称作是“双重任务”,因为,使用上面的例子,你要分配的值j这两个ix



文章来源: Java - Order of Operations - Using Two Assignment Operators in a Single Line