作者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
→ danny8376:真要這樣搞也多打幾個括號 不然接手的會恨死你(含自己) 02/18 01:44
→ andymai:為何不建議?那就要反問平常會這樣寫?人生沒有必要把時間花 02/18 01:59
推 pupuliao:有人真的這樣寫code ? 是有病還是自謔? 02/18 03:05
推 pupuliao:這頂多拿來理解規則,沒人真拿來實做吧.... 02/18 03:08
→ Killercat:C++99時代對於這個都是沒有定義 看編輯器 11就不知了 02/18 12:22
→ Killercat:所以a++ + ++a這種會爆漿 另外","運算子也是常出包的點 02/18 12:23
→ Killercat:還有一個很有趣的例子是x = ++x; 在C++一樣會爆漿 :D 02/18 12:25
→ ssccg:應該不是問為什麼不建議,而是為什麼會想這樣寫吧? 02/18 14:01
推 justin761002:推,長知識了! 02/19 04:51
→ justin761002:程式碼要以易讀、好維護為原則,這東西顯然不易讀啊! 02/19 04:55
推 fonz:詳細推 02/19 12:38
→ Killercat:這是誇張的例子,事實上惡毒的例子的話,很多很難察覺的 02/19 13:03
推 kiwatami:通常只有快離職才會這樣寫吧(誤) 02/23 19:53
→ danny8376:應該是寫完就快離職了吧(? 02/24 09:32
→ AnyaAlstreim:為了工作機會保障... 02/24 20:43