25

コード例:

int a[] = new int[]{0, 1, 2, 3};
int result = 0;
for (int i : a)
    result += i;

ループは、、、、をこの順序a[0]で繰り返すことが保証されていますか?答えはイエスだと強く信じていますが、このページは明確に順序を述べているようには見えません。a[1]a[2]a[3]

しっかりしたリファレンスを手に入れましたか?

4

4 に答える 4

46

JLS にforよると、強化されたステートメントでは、for ループは次のようになります。

int[] array = a;
for (int index = 0; index < a.length; index++) {
    int i = array[index];
    result += i;
}

「ここでarray、およびは、拡張ステートメントが発生するindex時点でスコープ内にある他の識別子 (コンパイラー生成またはその他) とは異なるコンパイラー生成の識別子です。」for(ここでは変数名を少し言い換えています)。

そうです: 注文は完全に保証されています.

于 2009-03-18T21:11:56.093 に答える
1

あなたが参照したページには、順不同の繰り返しを意味するものは見つかりませんでした。具体的な見積もりを投稿できますか?

いずれにせよ、このコードは次のとおりです。

public static void main( String args[] ) {
    double a[] = new double[] { 0, 1, 2, 3 };
    int result = 0;
    for ( double i : a ) {
        result += i;
    }

古いスタイルのループに逆コンパイルします。

 public static void main(String args[])
    {
        double a[] = {
            0.0D, 1.0D, 2D, 3D
        };
        int result = 0;
        double ad[];
        int k = (ad = a).length;
        for(int j = 0; j < k; j++)
        {
            double i = ad[j];
            result = (int)((double)result + i);
        }
    }

もちろん、それは保証と同じではありませんが、少なくとも、配列に対する順不同の反復は非常に奇妙であり、明らかに常識的な実装に反するように思われます。

于 2009-03-18T21:12:25.950 に答える