2014-07-03 14 views
8

phân công tôi đang bối rối về các bài ++ và tiền ++ nhà điều hành, ví dụ như trong đoạn mã sauincrement Java và điều hành

int x = 10; 
x = x++; 

sysout(x); 

sẽ in 10?

It in 10, nhưng tôi hy vọng nó sẽ in 11

nhưng khi tôi làm

x = ++x; instead of x = x++; 

nó sẽ in mười một như tôi mong đợi, vì vậy tại sao x = x ++; không thay đổi giá trị của x?

+3

Bởi vì loại này gây nhầm lẫn, bạn thực sự không nên làm điều này trong mã thực. –

+3

Thay vì 'x = x ++' ==> 'x ++' – donfuxx

+0

Bỏ phiếu để mở lại: câu hỏi trùng lặp là về sự khác biệt cụ thể giữa trước và sau tăng dần. Trong khi sự hiểu biết rằng sự khác biệt sẽ giúp trả lời câu hỏi này, nó không phải là một bản sao chính xác. – dasblinkenlight

Trả lời

8

Không, bản in của 10 là chính xác. Chìa khóa để hiểu lý do đằng sau kết quả là sự khác biệt giữa các khoản tiền trước ++x và sau khi tăng thêm x++ các phép gán hợp chất. Khi bạn sử dụng tiền gia tăng, giá trị của biểu thức được thực hiện sau khi thực hiện gia số. Khi bạn sử dụng tăng sau, mặc dù, giá trị của biểu thức được thực hiện trước khi tăng thêm và được lưu trữ để sử dụng sau, sau khi kết quả tăng được ghi lại vào biến.

Đây là chuỗi các sự kiện dẫn đến những gì bạn thấy:

  • x được gán 10
  • Do ++ ở vị trí hậu thặng dư, giá trị hiện tại của x (tức 10) được lưu trữ cho sau này sử dụng
  • giá trị mới của 11 được lưu trữ vào x
  • giá trị tạm thời của 10 được lưu trữ trở lại vào x, viết ngay trên 11 đã được lưu trữ ở đó.
0

tôi đã không tìm thấy một tài liệu tham khảo trong JLS, vì vậy câu trả lời này được xác định trên các suy đoán rằng bạn đang không gọi hành vi không xác định, bởi vì đây là Java.

x = x++; // Assign the old value of `x` to x, before increment. 
x = ++x; // Assign the new value of `x` to x, after increment. 

Đây là dựa trên định nghĩa của các toán tử hậu tố và tiền tố.

-1

Khi bạn làm điều này:

x = x++; 

Nó thực sự được phiên dịch sang "Gán 'x' thành 'x' và sau đó tăng 'x' bởi một".

Trong khi trong trường hợp này:

x = ++x; 

Nó được dịch sang "Tăng 'x' người một, sau đó gán nó vào 'x'".

+0

Có vẻ như đó là trường hợp, gỡ bỏ ưu tiên nói chuyện. – TheStack

0

Trích dẫn từ The Java tutorials - Assignment, Arithmetic, and Unary Operators: nhà khai thác

Các tăng/giảm có thể được áp dụng trước (prefix) hoặc sau (postfix) các toán hạng. Mã số result++;++result; sẽ kết thúc bằng kết quả được tăng thêm một.Sự khác biệt duy nhất là phiên bản tiền tố (++result) đánh giá giá trị gia tăng, trong khi phiên bản hậu tố (result++) đánh giá giá trị ban đầu. Nếu bạn chỉ thực hiện tăng/giảm đơn giản, nó không thực sự quan trọng bạn chọn phiên bản nào. Nhưng nếu bạn sử dụng toán tử này trong phần biểu thức lớn hơn, toán tử bạn chọn có thể tạo ra sự khác biệt đáng kể.

1

Đăng tăng (n ++): Trước tiên hãy thực hiện câu lệnh sau đó tăng giá trị một.

Tăng trước (++ n): Đầu tiên tăng giá trị lên một rồi thực hiện câu lệnh.

Ví dụ:

class IncrementTest{ 
    public static void main(String[] args){ 

     System.out.println("***Post increment test***"); 
     int n = 10; 
     System.out.println(n);  // output 10 
     System.out.println(n++); // output 10 
     System.out.println(n);  // output 11 

     System.out.println("***Pre increment test***"); 
     int m = 10; 
     System.out.println(m);  // output 10 
     System.out.println(++m); // output 11 
     System.out.println(m);  // output 11 
    } 
}