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à ++a
tă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.
++a
gia 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.
++a
gia số a
trước khi nó được đánh giá.
a++
đánh giá a
và 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 a
là 5, sau đó a++
cho biểu thức 5 và tăng a
sau đó, trong khi ++a
tăng a
trướ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 =20
và 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 =20
và 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)