問(wèn)題
public class Tests {
public static void main(String[] args) {
int i = 1;
i = i++;
System.out.println("i="+i);
int j = i++;
int k = i + ++i * i++;
System.out.println("i="+i);
System.out.println("j="+j);
System.out.println("k="+k);
}
}
輸出的值:
i=1
i=4
j=1
k=11
分析
1. 要談?wù)撨@個(gè)問(wèn)題首先要了解內(nèi)存結(jié)構(gòu)欢揖,因?yàn)橛?jì)算是在操作數(shù)棧中進(jìn)行的
局部變量表
a). 存儲(chǔ)方法中的局部變量烦绳,包括方法的參數(shù)态蒂。
b). 存放編譯器可知的各種基本類型(其中64位長(zhǎng)度的long和double類型數(shù)據(jù)占2個(gè)局部變量空間(Slot)),引用對(duì)象(reference類型骡苞,不同于對(duì)象本身,可能是指向起始地址的引用指針喘先,也可能是一個(gè)指向代表對(duì)象的句柄或其他與此對(duì)象相關(guān)的位置)和returnAddress類型(指向了一條字節(jié)碼指令的地址)钳吟。
c). 局部變量表的大小在編譯期間確定,程序執(zhí)行期間窘拯,大小不會(huì)改變红且。
操作數(shù)棧
a). 表達(dá)式地計(jì)算在操作數(shù)棧中完成。
b). 方法開(kāi)始執(zhí)行時(shí)為空树枫,執(zhí)行過(guò)程中有各種字節(jié)碼指令往操作數(shù)棧中寫入和提取內(nèi)容,即入棧/出棧操作景东。
c). 例如:算術(shù)運(yùn)算和參數(shù)傳遞砂轻。
2. 解析步驟
-
第一步:i = 1 ;
-
第二步:i=i++ ;
所以i=i++的輸出i仍然為1斤吐。
-
第三步:int j = i++;
所以搔涝,i在局部變量表中變成了2,操作數(shù)棧中的 i 值為1和措,并且將 i 的值返回給 j庄呈,即此條語(yǔ)句以后,i = 2派阱,j = 1诬留。
-
第四步:int k = i + ++i * i++
所以,i=4,k=11。
注意:i=++i(我們的 i 變量先在局部變量表中進(jìn)行自增文兑,然后再將 i 進(jìn)棧盒刚,然后再把棧中的數(shù)據(jù)返回給我們的變量 i )。