2011-12-04 48 views
24

Tại sao đầu ra trong ví dụ này là ?Mảng Java - Tại sao đầu ra '1'?

public static void main(String[] args){ 
int[] a = { 1, 2, 3, 4 }; 
int[] b = { 2, 3, 1, 0 }; 
System.out.println(a [ (a = b)[3] ]); 
} 

Tôi nghĩ nó sẽ là . ví dụ, khái niệm được đánh giá là:

a[(a=b)[3]] 
a[b[3]] //because a is now pointing to b 
a[0] 

nên không phải là một [0] được vì một được trỏ đến b?

Xin cảm ơn trước.

+3

Người đàn ông, C có điều này đơn giản hơn nhiều với điều "hành vi không xác định"! – Kos

+2

+1 cho các bài học kỳ lạ! –

+1

Đây là những loại câu hỏi mà một số bài kiểm tra Java hoặc người phỏng vấn muốn hỏi, mặc dù không ai lành mạnh sẽ viết mã như thế. – GreenieMeanie

Trả lời

16

Đó weirded tôi ra cũng ... Tuy nhiên, kiểm tra phần 15.7.1 trên here

Về cơ bản, toán hạng được đánh giá từ trái sang phải. Nhưng cũng lưu ý điều này:

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.

+1

Tôi luôn nghĩ rằng các dấu ngoặc kép được đánh giá đầu tiên - BODMAS – ziggy

26

Đối số cho mỗi toán tử được đánh giá từ trái sang phải. Tức là, a ở phía trước của [...] được đánh giá trước nội dung của nó, tại thời điểm đó nó vẫn tham chiếu đến mảng đầu tiên.

7
a [ (a = b)[3] ]) 

được hiểu như sau:

a = b => a = {2, 3, 1, 0}; 
(a = b)[3] => 0; 

Đây là thủ thuật ở đây: a được đánh giá là giá trị trước khi b được gán cho nó.

a[(a = b)[3]) => a[0] = 1; 

Hãy suy nghĩ về quyền ưu tiên của toán tử trong Java. Nó phải rõ ràng hơn một chút.

+0

-1: OP hỏi tại sao, bạn chỉ cho thấy rằng có thể nhận được 1 khi bạn sắp xếp lại hướng dẫn ... – Betlista

2

Như ông Marcelo Cantos Chỉ ra, Các đối số cho mỗi nhà điều hành được đánh giá từ trái sang phải. Vì vậy, đây là những gì tôi nghĩ rằng việc thực hiện là

a[(a=b)[3]] 

Ở đây, 'a' sẽ tìm nạp "1,2,3,4" và sau đó đối số của nó (a = b) [3] được đánh giá. Vì vậy, bây giờ a = b và phần tử tại chỉ số 3 trong mảng b được trả về, nó cũng được chỉ bởi a.

Do đó, chúng tôi nhận được '0' từ đánh giá đối số. Như đã nói trước đây, bên ngoài một vẫn đề cập đến nội dung cũ Như vậy cho một [0] trong 1,2,3,4 mảng.

Vì vậy, chúng tôi nhận được '1'.

Đây là sự hiểu biết của tôi. Xin vui lòng cho tôi biết nếu nó sai.

Xin cảm ơn,

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