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-loop 相当于

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 回答
7

请参阅Java 语言规范第 3 版的第 14.14.2 节

如果 Expression 的类型是 Iterable 的子类型,则令 I 为表达式 Expression.iterator() 的类型。增强的 for 语句等效于以下形式的基本 for 语句:

for (I #i = Expression.iterator(); #i.hasNext(); ) {
        VariableModifiersopt Type Identifier = #i.next();
   Statement
}

Where #i is a compiler-generated identifier that is distinct from any other identifiers (compiler-generated or otherwise) that are in scope (§6.3) at the point where the enhanced for statement occurs.

于 2009-03-18T21:14:23.107 回答
5

It states in the JLS that:

for ( VariableModifiersopt Type Identifier: Expression) Statement

is equivalent to

T[] a = Expression;
L1: L2: ... Lm:
for (int i = 0; i < a.length; i++) {
        VariableModifiersopt Type Identifier = a[i];
        Statement
}
于 2009-03-18T21:15:13.043 回答
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 回答