ムスタファMahmod:
私は、一言で言えば本にJavaでのコード行に出くわしたと私は、コンパイラは、このコードを分割方法を知りたいです
a[i++] += 2;
a[i++] = a[i++] + 2;
アンドリューTobilko:
15.26.1。単純な代入演算子=
左オペランドが配列アクセス式である場合(§15.10.3)、おそらくその後の括弧の一つ以上のペアで囲まれました:
まず、左オペランド配列アクセス式の配列参照副式が評価されます。この評価が中途完了するならば、代入式は同じ理由で中途完了する。(左オペランド配列アクセス式の)インデックス部分式と右側のオペランドを評価し、代入は起こらないれていません。
そうでない場合は、左オペランド配列アクセス式のインデックス部分式が評価されます。この評価が中途完了するならば、代入式が完了突然同じ理由と右側のオペランドに評価され、代入は起こらないされていません。
https://docs.oracle.com/javase/specs/jls/se12/html/jls-15.html#jls-15.26.1
私は次のように評価の順序があるべきと仮定します
a[i++] = a[i++] + 2;
^ ^ ^
1 3 2
----------
^
4
------
^
5
--------------------
^
6
私たちは、このスニペットを実行して、それを証明することができます
int[] a = {0, 10, 0, 0};
int i = 0;
a[i++] = a[i++] + 2;
System.out.println(Arrays.toString(a)); // [12, 10, 0, 0]
System.out.println(i); // 2