Các toán tử tăng sau (i ++) và trước tăng (++ i) hoạt động như thế nào trong Java?


99

Bạn có thể giải thích cho tôi đầu ra của mã Java này không?

int a=5,i;

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

System.out.println(a);
System.out.println(i);

Đầu ra là 20 trong cả hai trường hợp


9
Luôn tránh tuyên bố mập mờ :)
Prasoon Saurav

9
@Prasoon Saurav Không giống như C và C ++, Java và C # có thứ tự đánh giá được xác định nghiêm ngặt, vì vậy những câu lệnh này không mơ hồ.
Pete Kirkham

12
Tôi biết điều đó nhưng những tuyên bố đó vẫn không (không thể) được sử dụng cho mục đích thực tế nên người ta phải tránh nó.
Prasoon Saurav


4
@PeteKirkham Đã hơn sáu năm sau, nhưng tôi vẫn muốn chỉ ra rằng "mơ hồ", trong tình huống này, là mơ hồ - nó có thể có nghĩa là "trình biên dịch không biết phải đặt cái gì" hoặc có thể có nghĩa là "Lập trình viên không biết nó có nghĩa là gì ”.
Vụ kiện của Fund Monica vào

Câu trả lời:


150

Không giúp đỡ à?

a = 5;
i=++a + ++a + a++; =>
i=6 + 7 + 7; (a=8)

a = 5;
i=a++ + ++a + ++a; =>
i=5 + 7 + 8; (a=8)

Điểm chính là ++atăng giá trị và trả về ngay lập tức.

a++ cũng tăng giá trị (trong nền) nhưng trả về giá trị không thay đổi của biến - trông giống như nó được thực thi sau đó.


5
Bạn có chắc là == 9 trong cái thứ hai không?
Pete Kirkham

1
i = ++ a + ++ a + a ++; => i = 7 + 8 + 5; (a = 8) vì tăng số lượng bài đăng có mức ưu tiên cao nhất nên a ++ có được thực thi trước không?
rsirs

2
ví dụ phức tạp đến một cái gì đó dễ giải thích.
oznus

Câu trả lời này có giống nhau cho c # và c ++ không?
làm việc

Tại sao a, b và c bằng 2 ở đây? int a = 1; int b = a++; int c = ++b;Đã mong đợi b là 1 vì nó là một gia số sau.
Dennis

202

++agia số và sau đó sử dụng biến.
a++sử dụng và sau đó tăng biến.

Nếu bạn có

a = 1;

và bạn làm

System.out.println(a++); //You will see 1

//Now a is 2

System.out.println(++a); //You will see 3

codaddict giải thích đoạn mã cụ thể của bạn.


62

Trong cả hai trường hợp, lần đầu tiên nó tính toán giá trị, nhưng sau khi tăng dần nó giữ giá trị cũ và sau khi tính toán trả về

++ a

  1. a = a + 1;
  2. trả lại a;

a ++

  1. temp = a;
  2. a = a + 1;
  3. trở lại nhiệt độ;

8
Câu trả lời rõ ràng nhất
Kartik Chugh 27/12/17

2
đây là một trong những làm cho tôi hiểu rõ ràng .. cảm ơn.
rematnarab

22
i = ++a + ++a + a++;

i = 6 + 7 + 7

Làm việc : tăng a đến 6 (giá trị hiện tại 6) + tăng a đến 7 (giá trị hiện tại 7). Tổng là 13 bây giờ thêm nó vào giá trị hiện tại của a (= 7) và sau đó tăng a lên 8. Tổng là 20 và giá trị của a sau khi hoàn thành nhiệm vụ là 8.

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

i = 5 + 7 + 8

Hoạt động : Tại giá trị bắt đầu của a là 5. Sử dụng nó trong phép cộng và sau đó tăng nó lên 6 (giá trị hiện tại 6). Tăng a từ giá trị hiện tại 6 lên 7 để nhận toán hạng khác của +. Tổng là 12 và giá trị hiện tại của a là 7. Tiếp theo tăng a từ 7 đến 8 (giá trị hiện tại = 8) và cộng nó với tổng trước đó 12 để được 20.


những câu lệnh này hoạt động từ phải sang trái hay từ trái sang phải?
Abhijeet

10

++agia số atrước khi nó được đánh giá. a++đánh giá avà sau đó tăng nó.

Liên quan đến biểu thức của bạn đã cho:

i = ((++a) + (++a) + (a++)) == ((6) + (7) + (7)); // a is 8 at the end
i = ((a++) + (++a) + (++a)) == ((5) + (7) + (8)); // a is 8 at the end

Các dấu ngoặc mà tôi đã sử dụng ở trên được Java sử dụng ngầm. Nếu bạn nhìn vào các thuật ngữ theo cách này, bạn có thể dễ dàng nhận thấy rằng chúng đều giống nhau vì chúng có tính chất giao hoán.


1
@ KlasLindbäck giao hoán có nghĩa là bạn có thể hoán đổi cả hai biểu thức mà vẫn nhận được cùng một kết quả. Vì vậy a ++ + ++ a == ++ a + a ++ (5 + 7 == 6 + 6; a == 7 ở cuối).
Aurril

8

Trong ví dụ trên

int a = 5,i;

i=++a + ++a + a++;        //Ans: i = 6 + 7 + 7 = 20 then a = 8 

i=a++ + ++a + ++a;        //Ans: i = 8 + 10 + 11 = 29 then a = 11

a=++a + ++a + a++;        //Ans: a = 12 + 13 + 13 = 38

System.out.println(a);    //Ans: a = 38

System.out.println(i);    //Ans: i = 29

4

++ a là toán tử tăng tiền tố:

  • kết quả được tính toán và lưu trữ đầu tiên,
  • thì biến được sử dụng.

a ++ là toán tử gia tăng hậu tố:

  • biến được sử dụng đầu tiên,
  • sau đó kết quả được tính toán và lưu trữ.

Một khi bạn nhớ các quy tắc, EZ cho bạn để tính toán mọi thứ!


4

Giả sử rằng bạn muốn nói

int a=5; int i;

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

System.out.println(i);

a=5;

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

System.out.println(i);

a=5;

a=++a + ++a + a++;

System.out.println(a);

Điều này đánh giá:

i = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

vì vậy tôi là 6 + 7 + 7 = 20 và vì vậy 20 được in.

i = (5, a is now 6) + (7, a is now 7) + (8, a is now 8)

vì vậy tôi là 5 + 7 + 8 = 20 và vì vậy 20 được in lại.

a = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

và sau khi tất cả mặt phải được đánh giá (bao gồm cả việc đặt a thành 8) THÌ a được đặt thành 6 + 7 + 7 = 20 và do đó 20 được in lần cuối.


3

khi alà 5, sau đó a++cho biểu thức 5 và tăng asau đó, trong khi ++atăng atrước khi chuyển số vào biểu thức (choa trong trường hợp này là 6 cho biểu thức).

Vì vậy, bạn tính toán

i = 6 + 7 + 7
i = 5 + 7 + 8

3

Tuy nhiên, tôi tin rằng nếu bạn kết hợp tất cả các câu lệnh của mình và chạy nó trong Java 8.1, bạn sẽ nhận được một câu trả lời khác, ít nhất đó là kinh nghiệm của tôi.

Mã sẽ hoạt động như sau:

int a=5,i;

i=++a + ++a + a++;            /*a = 5;
                                i=++a + ++a + a++; =>
                                i=6 + 7 + 7; (a=8); i=20;*/

i=a++ + ++a + ++a;           /*a = 5;
                                i=a++ + ++a + ++a; =>
                                i=8 + 10 + 11; (a=11); i=29;*/

a=++a + ++a + a++;            /*a=5;
                                a=++a + ++a + a++; =>
                                a=12 + 13 + 13;  a=38;*/

System.out.println(a);        //output: 38
System.out.println(i);         //output: 29

3

Tăng trước nghĩa là biến được tăng TRƯỚC KHI nó được đánh giá trong biểu thức. Tăng sau có nghĩa là biến được tăng lên SAU KHI nó được đánh giá để sử dụng trong biểu thức.

Do đó, hãy xem xét cẩn thận và bạn sẽ thấy rằng cả ba bài tập đều tương đương về mặt số học.


2

tăng trước và tăng sau là tương đương nếu không có trong một biểu thức

int j =0;
int r=0         
for(int v = 0; v<10; ++v) { 
          ++r;
          j++;
          System.out.println(j+" "+r);
  }  
 1 1  
 2 2  
 3 3       
 4 4
 5 5
 6 6
 7 7
 8 8
 9 9
10 10

0
a=5; i=++a + ++a + a++;

i = 7 + 6 + 7

Làm việc: tăng trước / sau có Liên kết "từ phải sang trái" và ưu tiên trước hơn sau, vì vậy trước hết tăng trước sẽ được giải quyết như (++a + ++a) => 7 + 6. sau đó a=7được cung cấp để đăng tăng => 7 + 6 + 7 =20a =8.

a=5; i=a++ + ++a + ++a;

i=7 + 7 + 6

Đang làm việc: tăng trước / sau có Liên kết "từ phải sang trái" và ưu tiên trước hơn sau, vì vậy trước hết tăng trước sẽ được giải quyết khi (++a + ++a) => 7 + 6. Sau đó a=7được cung cấp cho tăng sau => 7 + 7 + 6 =20a =8.


0

Tôi tin rằng bạn đang thực hiện tất cả các câu lệnh này
thực thi khác nhau cùng nhau sẽ dẫn đến => 38, 29

int a=5,i;
i=++a + ++a + a++;
//this means i= 6+7+7=20 and when this result is stored in i,
//then last *a* will be incremented <br>
i=a++ + ++a + ++a;
//this means i= 5+7+8=20 (this could be complicated, 
//but its working like this),<br>
a=++a + ++a + a++;
//as a is 6+7+7=20 (this is incremented like this)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.