2012-07-11 24 views
11

Tôi chỉ muốn tạo ra một chút Java-Puzzle, nhưng tôi bối rối bản thân mình. Một phần của câu đố là:Pre- và postincrement trong Java

Gì đoạn mã sau đây làm:

public class test { 
    public static void main(String[] args) { 
     int i = 1; 
     i += ++i + i++ + ++i; 

     System.out.println("i = " + i); 
    } 
} 

Nó ra 9.

My (ít nhất là một phần) sai giải thích:

Tôi không khá chắc chắn, nhưng tôi nghĩ rằng thuật ngữ sau i += được đánh giá như thế này:

enter image description here

Vì vậy

int i = 1; 
i += ++i + i++ + ++i; 

giống với

int i = 1; 
i += ((++i) + (i++)) + (++i); 

Điều này được đánh giá từ trái sang phải (Xem Pre and postincrement java evaluation).

Số tiền ++i đầu tiên i đến 2 và trả lại 2. Vì vậy, bạn có:

i = 2; 
i += (2 + (i++)) + (++i); 

Các i++ lợi nhuận 2, vì nó là giá trị mới của i, và gia tăng i-3:

i = 3; 
i += (2 + 2) + ++i; 

Các ++i increments thứ hai i-4 và trả 4:

i = 4; 
i += (2 + 2) + 4; 

Vì vậy, bạn kết thúc với 12, không phải 9.

Lỗi trong phần giải thích của tôi ở đâu? Điều gì sẽ là một lời giải thích chính xác?

+2

Bạn có chắc chắn kết quả đầu ra 8 không? gây ra cho tôi nó kết quả đầu ra 9. –

+1

Cảm ơn gợi ý. Nó kết quả đầu ra 9. (8 là một trong những câu đố khác). Tuy nhiên, 9 không phải là 12. –

+1

Tôi nhận được đầu ra là 9 !! – Patton

Trả lời

10

i += ++i + i++ + ++i; cũng giống như i = i + ++i + i++ + ++i;

Phía bên tay phải được tính từ trái-to- phải, sinh lợi i = 1 + 2 + 2 + 4; (sản lượng i = 9).

+0

Vì vậy, suy nghĩ của tôi là chính xác, nhưng 'i + = s' được đánh giá với 'i = i + s' không tương đương với' i = s + i', trong đó 's' là một câu lệnh. Chính xác? Bạn có một nguồn cho thực tế là 'i + = a' được đánh giá là' i = i + a'? –

+2

@moose Đó là tất cả trong đặc tả ngôn ngữ Java: http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html # jls-15.26.2 – jn1kk

+0

@jsn Cảm ơn bạn đã liên kết với tôi. moose Câu hỏi hay ở đây. Các tình huống như thế này là nơi Toán học trở nên thực sự mờ nếu bạn không biết đặc điểm kỹ thuật hoặc nơi cần tìm. Chúc mừng. –

3

Bạn có quyền liên quan đến đánh giá phần bên phải, nhưng bạn thiếu một chi tiết liên quan đến bài tập.

Run này:

i = i++; 

hay này:

i += i++; 

Sau khi cả hai hoạt động, tôi vẫn còn có giá trị ban đầu của nó.

Đó là vì tôi được đánh giá ở bên trái trước phần bên phải của bài tập.

Vì vậy, trong trường hợp của bạn, bạn đang thêm 8 đến 1, không phải là 4.

3

Đầu ra là (try it)

int i = 1; 
i += ++i + i++ + ++i; 

trở thành

i = 1 + 2 + 2 + 4 
1

thật dễ dàng để hiểu cách hoạt động của nó nếu bạn tưởng tượng nó như thế nào java lưu trữ các giá trị trong sổ đăng ký! anh ta đặt 1 trong thanh ghi đầu tiên, và vượt qua dấu =, và tăng i (++ i), vì vậy bây giờ trong tôi bạn có 2, và trong thanh ghi thứ hai bạn có 2, nhưng thanh ghi đầu tiên không được cập nhật, trong thanh ghi thứ ba bạn sẽ có 2 và sau đó tôi được tăng lên, và sau đó tôi được tăng lên và trong thanh ghi cuối cùng bạn sẽ có 4. Vì vậy, bạn sẽ có một cái gì đó như thế này 1 = 2 + 2 + 4 == 9

1

int i = 1; 
i += ++i + i++ + ++i 

tương đương với

int tmp1 = i // 1, += 

i ++; // 2 
int tmp2 = i; // 2 

int tmp3 = i; // 2 
i ++; // 3 

i ++; // 4 
int tmp4 = i; // 4 

i = tmp1 + tmp2 + tmp3 + tmp4; // 9 
0

i += ++i + i++ + ++i;

  1. i=1 lúc khởi
  2. i += X ->i = i + X ->i = 1 + X (do đó cho phép đếm X)
  3. ++i sẽ được tăng lên đến 2 và return 2
  4. i++ sẽ return 2 và sau đó được tăng lên đến 3
  5. ++i sẽ được tăng từ 3 đến 4 và return 4
  6. X = 2 + 2 + 4 = 8

Vì vậy i = 1 + 8 ->i=9


Bạn sẽ nhận được 12 nếu mã của bạn sẽ là một cái gì đó như thế này

int i = 1; 
int tmp = ++i + i++ + ++i; 
i += tmp; 

vì sau đó mã của bạn sẽ i=1, và sau khi tính toán tmp tôi sẽ là i=4, sau đó i+=tmp ->i=4+8=12

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