Re: [問題] i += i++ 問題已刪文

看板java作者 (Utah)時間2年前 (2022/07/18 03:51), 2年前編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《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 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.229.144.55 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/java/M.1658087510.A.811.html ※ 編輯: UtahC (125.229.144.55 臺灣), 07/18/2022 03:56:39
文章代碼(AID): #1Yr6XMWH (java)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1Yr6XMWH (java)