示例代码:

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] 以该顺序?我坚信答案是肯定的,但是 这一页 似乎并没有明确地表明秩序。

有可靠的参考吗?

有帮助吗?

解决方案

根据的JLS,增强for语句,您的for循环相当于

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

“其中arrayindex是编译器生成的标识符可从任何其他标识符(编译器生成或以其它方式),其在范围在其中所述增强for语句发生点是不同的。” (略微这里复述变量名称)。

所以,是:顺序绝对保证

其他提示

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

  

如果表达式的类型是一个子类型   可迭代的,然后让我成为的类型   表达Expression.iterator()。   增强的for语句   等同于声明基本   的形式:

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

其中#i的是所生成的编译器   标识符是从任何不同   其他标识符(编译器生成的   或以其它方式),其在范围(§6.3)   的点处的增强型   发生语句。

它在 吉林森 那:

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
}

我没有找到你所引用的页面任何会暗示出的顺序迭代。你能后的具体报价?

在任何情况下,我发现这个代码:

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);
        }
    }

当然,这是不一样的保证,但至少是乱序遍历所有的数组会很奇怪,似乎违背明显的常识性的实现。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top