2012-02-25 19 views
11

Thứ tự hoạt động khi sử dụng hai toán tử gán trong một dòng là gì?Java - Trình tự hoạt động - Sử dụng hai toán tử chuyển nhượng trong một dòng đơn

public static void main(String[] args){ 
    int i = 0; 
    int[] a = {3, 6}; 
    a[i] = i = 9; // this line in particular 
    System.out.println(i + " " + a[0] + " " + a[1]); 
} 

Chỉnh sửa: Cảm ơn bài đăng. Tôi nhận được rằng = mất giá trị từ cánh phải nhưng khi tôi biên dịch này, tôi nhận được:

9 9 6 

Tôi nghĩ nó đã có và ArrayOutOfBounds ngoại lệ, nhưng nó được gán 'a [i]' trước nó di chuyển trên 9. Nó chỉ làm điều đó cho mảng?

Trả lời

10

= được phân tích cú pháp là kết hợp phù hợp, nhưng thứ tự đánh giá là từ trái sang phải.

Vì vậy: Câu lệnh được phân tích cú pháp là a[i] = (i = 9). Tuy nhiên, biểu thức i trong a[i] được đánh giá trước bên tay phải (i = 9), khi i vẫn là 0.

Đó là tương đương với một cái gì đó như:

int[] #0 = a; 
int #1 = i; 
int #2 = 9; 
i = #2; 
#0[#1] = #2; 
+0

Cảm ơn bạn Tom, điều này có ý nghĩa. – HSeldon

2

Nếu tôi nhớ chính xác, = toán tử là kết hợp phù hợp; vì vậy tôi sẽ được chỉ định trước, sau đó là [i].

0

Nhà điều hành = là liên kết phù hợp (như những người khác đã nói). Điều này có thể dễ dàng được chứng minh bằng thử nghiệm này:

int i = 2; 
int j = 3; 
int x = i = j; 
System.out.println(x); // This prints out 3. 

Làm việc với tất cả các loại, Đối tượng và nguyên thủy.

Cách tôi đã nghe điều này được gọi là "chuyển nhượng kép", vì sử dụng ví dụ trên, bạn chỉ định giá trị j cho cả hai số ix.

6

Theo thông số kỹ thuật:

15,26 khai thác Phân Có 12 nhà khai thác chuyển nhượng; tất cả đều liên kết cú pháp đúng (chúng nhóm từ phải sang trái). Như vậy, a = b = c nghĩa là a = (b = c), gán giá trị của c cho b và sau đó gán giá trị của b cho a.

Vì vậy, a[i] = i = 9; cũng giống như i = 9; a[i] = i;

Sửa

Trên thực tế, đó không phải là trường hợp. Mẫu lớp thử nghiệm:

import java.util.Arrays; 

public class Mkt { 
    public static void main(String[] args) { 
    int[] a = new int[10]; 
    int i = 5; 
    a[i] = i = 9; 

    System.out.println(Arrays.toString(a)); 
    } 
} 

mẫu chạy:

$ javac Mkt.java && java Mkt 
[0, 0, 0, 0, 0, 9, 0, 0, 0, 0] 

Vui lòng tham khảo the other answer để biết thêm thông tin. Về cơ bản:

  • a[i] = i = 9 cũng giống như a[i] = (i = 9), như = là phải kết hợp
  • Tuy nhiên, toán hạng đánh giá được từ trái sang phải, theo this:

    15,7.Thứ tự đánh giá

    Ngôn ngữ lập trình Java đảm bảo rằng toán hạng của toán tử xuất hiện để được đánh giá theo thứ tự đánh giá cụ thể, cụ thể là từ trái sang phải.

    Chúng tôi khuyên rằng mã không nên dựa chủ yếu vào đặc điểm kỹ thuật này. Mã thường rõ ràng hơn khi mỗi biểu thức chứa tối đa một hiệu ứng phụ, như hoạt động ngoài cùng của nó và khi mã không phụ thuộc vào chính xác ngoại lệ nào phát sinh như là hệ quả của việc đánh giá các biểu thức từ trái sang phải.

Tôi đã sao chép đoạn thứ hai rất hữu ích ở đây - hiếm khi viết mã khó hiểu như vậy có ý nghĩa.

Tôi cũng tìm thấy số séc this đáng giá.