13

1行で2つの代入演算子を使用する場合の演算の順序は何ですか?

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の例外だと思っていましたが、9に移動するに、「a [i]」を割り当てています。配列に対してそれを行うだけですか?

4

4 に答える 4

13

=は右連想として解析されますが、評価の順序は左から右です。

したがって、ステートメントはとして解析されa[i] = (i = 9)ます。ただし、の式iは、がまだの場合a[i]、右側(i = 9)の前に評価されます。i0

これは、次のようなものに相当します。

int[] #0 = a;
int #1 = i;
int #2 = 9;
i = #2;
#0[#1] = #2;
于 2012-02-25T03:28:58.013 に答える
6

仕様によると:

15.26代入演算子12個の代入演算子があります。すべて構文的に右に関連付けられています(右から左にグループ化されます)。したがって、a = b =cはa=(b = c)を意味し、cの値をbに割り当ててから、bの値をaに割り当てます。

だから、a[i] = i = 9;と同じです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プログラミング言語は、演算子のオペランドが特定の評価順序、つまり左から右に評価されているように見えることを保証します。

    コードがこの仕様に大きく依存しないようにすることをお勧めします。通常、各式に最も外側の操作として最大で1つの副作用が含まれている場合、および式の左から右への評価の結果として発生する例外にコードが正確に依存しない場合、コードはより明確になります。

ここで非常に有益な2番目の段落をコピーしました-そのような紛らわしいコードを書くことはめったに意味がありません。

これもチェックする価値があると思います。

于 2012-02-25T03:22:56.957 に答える
2

私が正しく覚えていれば、=演算子は右結合法則です。したがって、iが最初に割り当てられ、次にa[i]が割り当てられます。

于 2012-02-25T03:13:49.420 に答える
0

=演算子は右結合です(他の人がすでに言っているように)。これは、このテストで簡単に証明できます。

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

これは、すべてのタイプ、オブジェクト、およびプリミティブで機能します。

上記の例を使用すると、とのj両方iに値を割り当てているため、これが言及されているのを聞いたのは「二重割り当て」xです。

于 2012-02-25T03:21:08.073 に答える