Java foreach迭代顺序是否精确定义了基元?

时间:2009-03-18 21:05:07

标签: java foreach iteration

示例代码:

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]?我坚信答案是肯定的,但this page似乎并没有毫不含糊地说明秩序。

有一个可靠的参考?

4 个答案:

答案 0 :(得分:46)

根据the JLS, The enhanced for statement,你的for循环相当于

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

“其中arrayindex是编译器生成的标识符,它们与增强for点范围内的任何其他标识符(编译器生成的或其他标识符)不同声明发生。“ (在这里稍微解释变量名称)。

是的:订单绝对保证。

答案 1 :(得分:7)

请参阅section 14.14.2 of the Java Language Specification, 3rd edition

  

如果Expression的类型是子类型   Iterable,然后让我成为类型   表达式Expression.iterator()。   增强的声明是   相当于一个基本的陈述   形式:

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

其中#i是编译器生成的   与任何不同的标识符   其他标识符(编译器生成的   或者在其他方面)在范围内(§6.3)   在增强的点   声明发生。

答案 2 :(得分:5)

它在JLS中指出:

for ( VariableModifiersopt Type Identifier: Expression) Statement

相当于

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

答案 3 :(得分: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);
        }
    }

当然,这与保证不同,但至少在阵列上的无序迭代会非常奇怪,并且似乎违背了明显的常识实现。