public static void main(String[] args) {
int j = 0;
j = j++;
}
這段代碼的結(jié)果是0.從字節(jié)碼指令的角度來分析下。
在講字節(jié)碼之前,先簡單的了解下Java棧,在JVM中有這么一個(gè)數(shù)據(jù)結(jié)構(gòu)叫Java棧,當(dāng)線程啟動(dòng)的時(shí)候,會(huì)分配一塊內(nèi)存當(dāng)做該線程的棧,每個(gè)棧由一系列的棧幀組成。每個(gè)棧幀對應(yīng)一個(gè)方法,當(dāng)線程執(zhí)行方法時(shí),就是棧幀出棧入棧的過程。
每個(gè)棧幀包含三部分?jǐn)?shù)據(jù):本地變量(參數(shù)+方法內(nèi)的變量)、操作數(shù)棧和其它數(shù)據(jù),本文主要涉及本地變量和操作數(shù)棧。
1.普通的賦值操作。

image.png
0234是a,b變量的初始化操作
5 iload_2 把b變量的值放入棧
6 istore_1 把棧的值賦值給變量a
2.i=i++

image.png
2 iload_1 把變量i的值入棧
3 iinc 1 by 1 遍量i自增 i=1
6 istore_1處棧,把棧中的值賦值給變量i i=0