作者LPH66 (f0VMRgEBA)
看板java
標題Re: [問題] 關於一個小程式的問題
時間Mon Feb 17 23:48:13 2014
推文有點久所以回一篇
※ 引述《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
推 CrystalNik:好詳細!! 懂了!! 偷偷問一下為什麼實際寫程式不建議這 02/17 23:58
→ LPH66:其實主要是防止腦袋打結 XD 另外 C/C++ 不規定結果會如何 02/18 00:02
推 PsMonkey:建議也看一下 z-3-4-8 02/18 00:17