24

この例の出力が1になっているのはなぜですか?

public static void main(String[] args){
 int[] a = { 1, 2, 3, 4 };   
 int[] b = { 2, 3, 1, 0 };   
 System.out.println( a [ (a = b)[3] ] );   
}

2だと思っていました。つまり、式は次のように評価されます。

a[(a=b)[3]]
a[b[3]]    //because a is now pointing to b
a[0]   

a がbを指しているので a[0] は2であってはなりませんか?

前もって感謝します。

4

4 に答える 4

26

各演算子の引数は、左から右に評価されます。つまり、 のa前にある[...]はその内容の前に評価され、その時点ではまだ最初の配列を参照しています。

于 2011-12-04T11:29:31.780 に答える
16

それも私を奇妙にさせました...しかし、ここのセクション15.7.1をチェックしてください

基本的に、オペランドは左から右に評価されます。しかし、これにも注意してください:

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

于 2011-12-04T11:30:43.583 に答える
7
a [ (a = b)[3] ] )

次のように解釈されます。

a = b => a = {2, 3, 1, 0};
( a = b )[3] => 0;

ここにトリックがあります:割り当てられるa前の値として評価されます。b

a[(a = b)[3]) => a[0] = 1;

Javaでの演算子の優先順位について考えてみてください。それはもう少し明白なはずです。

于 2011-12-04T15:57:21.753 に答える
2

Marcelo Cantos 氏が指摘したように、各演算子への引数は左から右に評価されます。したがって、ここに実行があると思います

a[(a=b)[3]]

ここで、外側の 'a' は "1,2,3,4" をフェッチし、その引数 (a=b)[3] が評価されます。したがって、ここで a=b となり、配列 b のインデックス 3 の要素が返されます。これも a によってポイントされます。

したがって、引数の評価から「0」を取得します。前に述べたように、outer a はまだ古い内容を参照しているため、1,2,3,4 配列で a[0] が得られます。

したがって、「1」が得られます。

これが私の理解です。間違っている場合はお知らせください。

ありがとう、

于 2014-08-19T23:43:25.617 に答える