2009-03-18 31 views

Trả lời

46

Theo the JLS, The enhanced for statement, bạn cho vòng lặp là tương đương với

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

"nơi arrayindex là những định danh biên dịch tạo được khác biệt với bất kỳ định danh khác (trình biên dịch tạo hay cách khác) có trong phạm vi tại thời điểm xảy ra tuyên bố nâng cao for. " (hơi diễn giải các tên biến ở đây).

Vì vậy, có: đơn đặt hàng được đảm bảo hoàn toàn.

1

Tôi không tìm thấy bất kỳ nội dung nào trong trang mà bạn đã tham chiếu có nghĩa là lặp lại không theo thứ tự. Bạn có thể đăng báo giá cụ thể không?

Trong mọi trường hợp, tôi thấy rằng mã này:

public static void main(String args[]) { 
    double a[] = new double[] { 0, 1, 2, 3 }; 
    int result = 0; 
    for (double i : a) { 
     result += i; 
    } 

dịch ngược để kiểu cũ vòng lặp:

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

Tất nhiên, đó không phải là giống như một bảo lãnh, nhưng đồng rất ít nhất là out-of-order iteration trên một mảng sẽ là rất lạ và dường như đi ngược lại thực hiện cảm giác thông thường rõ ràng.

+1

Nó có thể là nhanh hơn để phân chia các yếu tố và sợi vòng lặp. Một số trình biên dịch đã được unroll và vectorize vòng làm toán. Đó là không đúng thứ tự. Chủ đề có thể là điều tiếp theo. –

7

Xem section 14.14.2 of the Java Language Specification, 3rd edition.

Nếu loại của Expression là một subtype của Iterable, sau đó cho phép tôi được loại biểu thức Expression.iterator(). Các tăng cường cho tuyên bố là tương đương với một cơ sở cho tuyên bố của dạng:

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

đâu #I là một trình biên dịch tạo nhận dạng đó là khác biệt với bất kỳ định danh khác (trình biên dịch tạo hoặc) nằm trong phạm vi (§6.3) tại thời điểm được tăng cường cho tuyên bố .

5

Nó nói trong JLS rằng:

for (VariableModifiersopt Type Identifier: Expression) Statement 

tương đương với

T[] a = Expression; 
L1: L2: ... Lm: 
for (int i = 0; i < a.length; i++) { 
     VariableModifiersopt Type Identifier = a[i]; 
     Statement 
} 
+1

Đối với những người bối rối/không quen thuộc như tôi đã được theo cú pháp nhãn "L1: L2: ... Lm", xem http: // stackoverflow.com/questions/2710422/please-explain-the-usage-of-dán nhãn-câu lệnh – cellepo

Các vấn đề liên quan