示例代码:
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似乎并没有毫不含糊地说明秩序。
有一个可靠的参考?
答案 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;
}
“其中array
和index
是编译器生成的标识符,它们与增强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);
}
}
当然,这与保证不同,但至少在阵列上的无序迭代会非常奇怪,并且似乎违背了明显的常识实现。