精華區beta java 關於我們 聯絡資訊
推文有點久所以回一篇 ※ 引述《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