※ 引述《jacky0816 (jacky)》之銘言:
: 新手遇到一個問題
: int i = 5;
: i += i++;
: 跑出來是10
: 請問怎運作的? 為何i++最後沒加1
半夜睡不著覺,碰巧看到這個問題,來發表一下自己的理解。
首先,如果在一般工作團隊中寫出這種code,基本上是被幹到飛起,所以請別這麼做。
這個問題從Java code是很難解釋清楚的,由bytecode理解起來相對容易許多。
這兩行程式對應的bytecode大致如下:
0 iconst_5
1 istore_1
2 iload_1
3 iload_1
4 iinc 1 by 1
7 iadd
8 istore_1
這邊牽涉到一個重要的名詞:operand stack
簡化一下可以想像成JVM有一塊區域是負責存區域變數,當需要進行運算時,需要將區域變數的值複製一份存到operand stack中再進行實際的運算。
這麼一來就容易理解許多了,小弟稍微做一下調整方便說明,情況大致如下:
0 iconst_5 => 這裡有一個integer,值為5
1 istore_i => 將5 assign到名為i的變數
2 iload_i => 將i的值push到operand stack
3 iload_i => 將i的值再次push到operand stack,此時stack中有兩個5
4 iinc i by 1 => 將i的值+1再assign給i,此時i的值為6,但stack中依然是兩個5
7 iadd => 將operand stack中存放的兩個值pop出來相加,5+5=10
8 istore_i => 將10再assign給i,最終i=10
這樣看來應該就很清楚了,i++並不是沒有做,而是assign給i之後,又被後續執行的計算結果給覆蓋掉了。
以上是小弟粗淺的見解,有誤請不吝指教。
另外附上i += ++i對應的bytecode,有興趣的話可以對照看看:
0 iconst_5
1 istore_1
2 iload_1
3 iinc 1 by 1
6 iload_1
7 iadd
8 istore_1