프리미티브에 대한 Java foreach 반복 순서가 정확하게 정의되어 있습니까?

StackOverflow https://stackoverflow.com/questions/660097

  •  20-08-2019
  •  | 
  •  

문제

예제 코드 :

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

물론, 그것은 보증과 동일하지는 않지만, 어레이에 대한 최소한의 반복적 인 반복은 매우 이상하고 명백한 상식 구현에 반대하는 것처럼 보일 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top