2017-05-05 7 views
2

最近、拡張forループを導入したDowney's Think Javaを読んでいます。拡張されたforループは、配列を横断する際に要素インデックスを考慮しないことに言及しました。しかし、(これが所属するコードの残りの部分は罰金だ)それがないと思われ拡張されたforループの移動Java

public static double[] powArray(double[] a) { 
     for (double value : a) { 
      value = Math.pow(value, 2.0); 
     } 
     return a; 
    }     

を:私はこれが動作から次のような方法のようなものを阻害しないだろうと思いました。ただ、注意することは、この方法では、私は次のことを実行したときと同じ配列を返す終わる:

System.out.println(Arrays.toString(powArray(a))); 

私はここでの問題は、私はループや配列のための強化を処理していますどのようにあるかどうかを理解するトラブルを抱えていると仮定します参照。 ありがとうございます!

+0

結果はどのようになると思いますか? –

+1

私は、それが2乗の要素を持つ配列を返すと考えました。 –

+5

[JLS](https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.14.2)を参照してください。「拡張for文は同等です。フォームの基本的なfor文に変換します。 "配列要素ではなく、新しい変数を二乗することになります。 –

答えて

4

それがアレイ上に拡張forループの等価形態を与えるJLS Sec 14.14.2でルック:

for ({VariableModifier} TargetType Identifier : Expression) Statement 

[Expressionが配列型である場合、と等価である]

T[] #a = Expression; 
L1: L2: ... Lm: 
for (int #i = 0; #i < #a.length; #i++) { 
    {VariableModifier} TargetType Identifier = #a[#i]; 
    Statement 
} 

ループはコンパイラによって次のように変換されます。

double[] a = arr; 
for (int i = 0; i < a.length; i++) { 
    double value = a[i]; 
    value = Math.pow(value, 2.0); 
} 

あなたは二等分してvalueですが、その値はarr(またはa、偶数)に書き戻されることはありません。

あなたは配列の要素を変更したい場合は、明示的にループするための基本的なを使用する必要があります。

for (int i = 0; i < a.length; i++) { 
    a[i] = Math.pow(a[i], 2.0); 
} 
+0

これは、この質問をしている人のレベルで誰かを助けるのではないかと疑います。 – BPS

+0

私はあなたの答えをupvotedし、自分の受け入れられた答えを編集しました。ありがとうございました! – jschnasse

1

JVMが役立つどのように動作するかの作業メンタルモデル。

配列変数の値は参照変数です。

double変数の値はdoubleです。

ループの各繰り返しで、value変数に、配列の要素がコピーされます。あなたは

value = Math.pow(value, 2.0); 

を行うと

あなただけvalue変数(コピー)の値を変更しています。配列の値がvalueの値にコピーされ、割り当てによって変更された値だったため、これは配列には影響しません。

0

を配列に戻すか、新しい配列を作成し、すべてのpow値を格納してこの配列を戻す必要があります。

関連する問題