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
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
Câu trả lời:
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 đó.
int a = 1; int b = a++; int c = ++b;Đã mong đợi b là 1 vì nó là một gia số sau.
++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.
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
a ++
i = ++a + ++a + a++;
Là
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;
Là
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.
++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.
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.
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
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
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.
a=5; i=++a + ++a + a++;
Là
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 =20và a =8.
a=5; i=a++ + ++a + ++a;
Là
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 =20và a =8.
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)