jvm裡面有兩個存儲區,一個是暫存區(是一個堆棧),另一個是變量區。
語句istore_1是将堆棧中的值彈出存入相應的變量區(指派);語句iload_1是将變量區中的值暫存入堆棧中。
因為j = j++;是先将j的值(0)存入堆棧,然後對變量區中的j自加1,這時j的值的确是1,但是随後的istore_1又将堆棧的值(0)彈出賦給變量區的 j,是以最後j = 0。 也就是說你執行100次j=j++,最後j也是0,但是你要是j=++j執行100次最後j=100,原理因為j = ++j;是先對變量區中的j自加1,然後再将變量區中j的值(1)存入堆棧,雖然最後執行了istore_1,但也隻是将堆棧中的值(1)彈出賦給變量區的j,是以j = ++j;的結果是j = 1。
i++的情況
iconst_0 得到或建立一個初始常量值0
istore_1 将初始值0賦給i(這個0是來自暫存區,i是變量區)
iload_1 i要開始自增了,先加載,值是0(自增運算是在暫存區中進行,是以加載的值0放入暫存區)
iinc 1,1 i自增為1(這個計算結果仍在暫存區)
istore_1 将值再賦給i (将暫存區的計算結果賦給變量區的變量i)
++i的情況
iconst_0
istore_1
iinc 1,1
iload_1
istore_1