Re: [問題] 關於一個小程式的問題
推文有點久所以回一篇
※ 引述《CrystalNik (水晶尼克)》之銘言:
: public static void main(String args[])
: {
: x--;
: myMethod();
: System.out.println( x + y + ++x );
: }
: public static void myMethod()
: {
: y = x++ + ++x ;
: }
事情是這樣的
y = x++ + ++x; 在 java 裡的動作依序如下:
(0) 首先一開始 x 是 -1;
(1) 求 x++ 的值 (為 x 目前的值) 並帶附加效應讓 x 的值加一
於是求得的值是 -1, x 的值成為 0;
(2) 求 ++x 的值 (為 x 目前的值加一) 並帶附加效應讓 x 的值加一
於是求得的值是 1, x 的值成為 1;
(3) 做加, 把 (1) 跟 (2) 求得的值加起來, 故這時 y 的值成為 0;
所以 myMethod 做完之後 x 的值是 1, y 的值是 0
回到 main 之後, System.out.println( x + y + ++x ); 又依序做了這些事:
(4) 求 x 的值, 得 1;
(5) 求 y 的值, 得 0;
(6) 做第一個加, 把 (4) 跟 (5) 求得的值加起來, 得 1;
(7) 求 ++x 的值 (為 x 目前的值加一) 並帶附加效應讓 x 的值加一
於是求得的值是 2, x 的值成為 2;
(8) 做第二個加, 把 (6) 跟 (7) 求得的值加起來, 得 3;
(9) 呼叫 println 印出 (8) 的結果
所以最後印出來的是 3
---
JLS 15.7 節對這部份的規定很詳細
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.7
二元運算子會隔開其兩個運算元的效應啟動跟結算時間
一定是左邊完全算完效應也結算了右邊才開始動作
(1) (2) (7) 的結果會是這樣就是這個規定的原因
不過實際在寫程式請不要這樣寫, 會出大事....
--
LPH [acronym]
= Let Program Heal us
-- New Uncyclopedian Dictionary, Minmei Publishing Co.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.195.35.61
推
02/17 23:58, , 1F
02/17 23:58, 1F
→
02/18 00:02, , 2F
02/18 00:02, 2F
推
02/18 00:17, , 3F
02/18 00:17, 3F
→
02/18 01:44, , 4F
02/18 01:44, 4F
→
02/18 01:59, , 5F
02/18 01:59, 5F
推
02/18 03:05, , 6F
02/18 03:05, 6F
推
02/18 03:08, , 7F
02/18 03:08, 7F
→
02/18 12:22, , 8F
02/18 12:22, 8F
→
02/18 12:23, , 9F
02/18 12:23, 9F
→
02/18 12:25, , 10F
02/18 12:25, 10F
→
02/18 14:01, , 11F
02/18 14:01, 11F
推
02/19 04:51, , 12F
02/19 04:51, 12F
→
02/19 04:55, , 13F
02/19 04:55, 13F
推
02/19 12:38, , 14F
02/19 12:38, 14F
→
02/19 13:03, , 15F
02/19 13:03, 15F
推
02/23 19:53, , 16F
02/23 19:53, 16F
→
02/24 09:32, , 17F
02/24 09:32, 17F
→
02/24 20:43, , 18F
02/24 20:43, 18F
討論串 (同標題文章)