프리미티브에 대한 Java foreach 반복 순서가 정확하게 정의되어 있습니까?
문제
예제 코드 :
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-loop는 동일합니다
int[] array = a;
for (int index = 0; index < a.length; index++) {
int i = array[index];
result += i;
}
"어디 array
그리고 index
향상된 시점에서 범위에있는 다른 식별자 (컴파일러 생성 또는 기타)와 구별되는 컴파일러 생성 식별자입니다. for
진술이 발생합니다. "(여기서 변수 이름을 약간 역설).
그렇습니다 : 주문은 절대적으로 보장됩니다.
다른 팁
보다 Java 언어 사양, 제 3 판 14.14.2 절.
표현 유형이 반복 가능한 하위 유형이라면, 표현식의 유형이되도록하자. 진술을 위해 향상된 것은 양식의 진술을위한 기본과 동일합니다.
for (I #i = Expression.iterator(); #i.hasNext(); ) { VariableModifiersopt Type Identifier = #i.next(); Statement }
여기서 #i는 명령문이 발생하는 시점에서 범위 (§6.3)에있는 다른 식별자 (컴파일러 생성 또는 기타)와 다른 컴파일러 생성 식별자입니다.
그것은 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
}
나는 당신이 언급 한 반복을 암시 할 페이지에서 아무것도 찾지 못했습니다. 특정 견적을 게시 할 수 있습니까?
어쨌든이 코드는 다음과 같습니다.
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);
}
}
물론, 그것은 보증과 동일하지는 않지만, 어레이에 대한 최소한의 반복적 인 반복은 매우 이상하고 명백한 상식 구현에 반대하는 것처럼 보일 것입니다.
제휴하지 않습니다 StackOverflow