Re: [問題] 關於一個小程式的問題

看板java作者 (f0VMRgEBA)時間10年前 (2014/02/17 23:48), 編輯推噓7(7011)
留言18則, 12人參與, 最新討論串2/2 (看更多)
推文有點久所以回一篇 ※ 引述《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
其實主要是防止腦袋打結 XD 另外 C/C++ 不規定結果會如何
02/18 00:02, 2F

02/18 00:17, , 3F
建議也看一下 z-3-4-8
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
有人真的這樣寫code ? 是有病還是自謔?
02/18 03:05, 6F

02/18 03:08, , 7F
這頂多拿來理解規則,沒人真拿來實做吧....
02/18 03:08, 7F

02/18 12:22, , 8F
C++99時代對於這個都是沒有定義 看編輯器 11就不知了
02/18 12:22, 8F

02/18 12:23, , 9F
所以a++ + ++a這種會爆漿 另外","運算子也是常出包的點
02/18 12:23, 9F

02/18 12:25, , 10F
還有一個很有趣的例子是x = ++x; 在C++一樣會爆漿 :D
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
文章代碼(AID): #1J0Yz0wp (java)
文章代碼(AID): #1J0Yz0wp (java)