2011-12-04 8 views
24

この例の出力はなぜですか?Java配列 - なぜ出力が '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] ]); 
} 

私はそれがだろうと思いました。すなわち、式は以下のように評価される:Bを指しているので

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

[0] すべきではありませんか?

ありがとうございます。

+3

男、Cはその「未定義の動作」もので、そんなに単純にこれを持っています! – Kos

+2

+1奇妙な学習のために! –

+1

これは、Javaテストやインタビュアーが尋ねたいと思うような質問です。正気な人はいません。 – GreenieMeanie

答えて

16

は、オペランドは、左から右に評価されます。しかし、次の点にも注意してください。

この仕様では、コードが決定的に重要ではないことが推奨されます。コードは、それぞれの式が最大で1つの副作用を含むとき、その最も外側の操作として、そしてコードが左から右の式の評価の結果として生じる例外に正確に依存しないときに、通常より明白です。

+1

私はいつも括弧が最初に評価されると考えました - BODMAS – ziggy

26

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

here上のセクション15.7.1を確認...にも私をweirded

7
a [ (a = b)[3] ]) 

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

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

はここにトリックです:b前の値がそれに割り当てられているようaが評価されます。

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

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

+0

-1:OPはなぜ尋ねられましたか、指示を並べ替えると1になることを示しました... – Betlista

2

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

a[(a=b)[3]] 

ここで「」[3]が評価され、フェッチ「1,2,3,4」とその引数(= B)になる外と思われるものです。したがって、a = bとbの配列のインデックス3の要素が返されます。

したがって、引数評価から '0'が得られます。前述したように、外側のaはまだ古いコンテンツを参照しているため、1,2,3,4の配列で[0]を返します。

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

これは私の理解です。間違っている場合は教えてください。

おかげで、

関連する問題