2010-03-03 33 views
57

Bạn có thể giải thích cho tôi đầu ra của mã Java này không?Các toán tử tăng (i ++) và tăng trước (++ i) hoạt động như thế nào trong Java?

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

+1

7 + 7 + 6 = 20. _____ – kennytm

+3

Luôn tránh báo cáo mơ hồ :) –

+7

@Prasoon Saurav Không giống như C và C++, Java và C# đã xác định nghiêm ngặt thứ tự đánh giá, vì vậy các câu này không rõ ràng. –

Trả lời

88

Điều này có hữu ích không?

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

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

Bạn có chắc chắn một == 9 trong phần thứ hai không? –

+0

Bạn nói đúng, nó không phải là 9. Nó là 8. – kgiannakakis

+0

i = ++ a + ++ a + a ++; => i = 7 + 8 + 5; (a = 8) kể từ khi tăng bài có ưu tiên cao nhất, không một ++ được thực thi đầu tiên? – rsirs

7

++a increments a trước khi nó được đánh giá. a++ đánh giá a và sau đó tăng nó.

liên quan đến biểu hiện của bạn đưa ra:

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 parenteses tôi đã sử dụng trên được ngầm được sử dụng bởi Java. 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 thấy, rằng chúng đều giống như chúng giao hoán.

+1

để mã của anh ấy nói: i = 6 + 7 + 7; i = 5 + 7 + 8 – user181750

+1

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

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

i = 6 + 7 + 7 

Làm việc: tăng một đến 6 (giá trị hiện tại 6) + tăng một đến 7 (giá trị hiện tại 7). Sum là 13 giờ thêm nó vào giá trị hiện tại của một (= 7) và sau đó tăng một đến 8. Sum là 20 và giá trị của một sau khi chuyển nhượng hoàn thành là 8.

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

được

i = 5 + 7 + 8 

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

+0

các báo cáo này hoạt động sang phải hoặc trái sang phải? – Abhijeet

1

khi a là 5, sau đó đưa ra một a++ 5 đến sự biểu hiện và gia tăng a sau đó, trong khi ++a increments a trước khi đi qua số để biểu thức (mang đến cho a 6 đến sự biểu hiện trong trường hợp này).

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

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

++a gia 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 cụ thể của bạn.

4

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 
0
a=5; i=++a + ++a + a++; 

i = 7 + 6 + 7 

làm việc: trước/sau increment có "phải sang trái" Associativity, và trước có độ ưu tiên về bưu chính, do đó, trước tất cả các tăng trước sẽ được giải quyết là (++a + ++a) => 7 + 6. sau đó a=7 được cung cấp để tăng số tiền = = 7 + 6 + 7 =20a =8.

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

i=7 + 7 + 6 

làm việc: trước/sau increment có "phải sang trái" Associativity, và trước có độ ưu tiên về bưu chính, vì vậy trước hết là tăng tiền sẽ được giải quyết như (++a + ++a) => 7 + 6 .Sau đó a=7 được cung cấp để tăng số tiền = = 7 + 7 + 6 =20a =8.

0

pre-increment và bài increment là tương đương nếu không muốn nói 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 
1

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

Mã này sẽ làm việc như thế này:

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 
2

++ a là tiền tố increment điều hành:

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

một ++ là increment postfix điều hành:

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

Khi bạn nhớ các quy tắc, EZ để ya tính toán mọi thứ!

1

Giả sử bạn có nghĩa là

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); 

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à do đó 20 được in ra.

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

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 bên phải được đánh giá (bao gồm đặt thành 8) THEN a được đặt thành 6 + 7 + 7 = 20 và 20 được in lần cuối.

10

Trong cả hai trường hợp nó lần đầu tiên tính toán giá trị, nhưng trong bài-increment nó giữ giá trị cũ và sau khi lợi nhuận tính toán nó

++ một

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

một temp ++

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

Câu trả lời rõ ràng nhất –

0

Tôi tin rằng bạn đang thực hiện tất cả các báo cáo khác nhau
thực hiện cùng nhau sẽ cho kết quả => 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) 
Các vấn đề liên quan