如果隻用普通的知識解釋i++和++i的話
i++ 先将i指派再++
++i 先++再指派
但是這簡單的回答并不能入吸引面試官的眼球,如果用java位元組碼指令分析則效果完全不同。
運作結果

通過<code>javap -v out</code>目錄下的class檔案名 在終端運作得到如下結果
第一類問題
對應的指令為
先将i1的值為10入棧(bipush),然後将int類型的值從棧中存到局部變量表0的位置,然後執行iinc将0位置的值+1,然後将局部變量表0位置的數入棧執行輸出操作
是以i1的值為11
先将i2的值為10入棧(bipush),然後将int類型的值從棧中存到局部變量表1的位置,然後執行iinc将1位置的值+1,然後将局部變量表1位置的數入棧執行輸出操作
是以i2的值為11
由于沒有指派操作,差別不大。
第二類問題
先将i3入棧存儲到局部變量表2的位置,然後将它入棧,執行iinc将2位置的值加一,i4存儲到局部表量表3的位置
是以i3是11,i4還是10
将i5入棧存儲到局部變量表4的位置,由于是++i是以先iinc将4位置的值加一,然後将局部變量表4的值入棧,執行指派操作,是以都是11
第三類問題
先将i7入棧,然後存到局部變量表6的位置,先把i6入棧,然後把6處的值加一,由于又将這個值存儲到局部變量表6處,是以産生覆寫又把值變為10。
而++i不會産生覆寫先執行加一然後再把值入棧,在指派給局部變量表中,是以i8為11。
第四類問題
先将i9=10入棧,然後存在局部變量表8的位置
先iload将8位置的i9入棧然後執行iinc将8處的i9加一,然後執行++i9,在将8處的i9加一
此時i9=10+1+1為12,然後将8位置的i9入棧,執行add将棧中的兩i9相加,得到的值存儲到局部變量表9的位置
是以i10=10+12(i9++後還是10,++i9後是12,因為執行了兩次iinc操作)
然後調用虛方法和靜态方法,在将9處的值入棧執行輸出語句
本文為「默默無聞代碼人」的原創文章