Java 对原语的迭代顺序是否精确定义?

2022-09-01 18:21:04

示例代码:

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]

有可靠的参考吗?


答案 1

根据 JLS,增强的 for 语句,您的 for 循环等效于

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

“其中 和 是编译器生成的标识符,与在增强语句发生时作用域内的任何其他标识符(编译器生成的或其他标识符)不同。(稍微解释一下这里的变量名称)。arrayindexfor

所以是的:订单是绝对有保证的。


答案 2

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

如果表达式的类型是可迭代的子类型,那么让我成为表达式 Expression.iterator() 的类型。增强的 for 语句等效于以下形式的基本 for 语句:

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

其中 #i 是编译器生成的标识符,它与在发生增强 for 语句时作用域 (§6.3) 中的任何其他标识符(编译器生成的或其他标识符)不同。