你真的會 i++嗎
題目如下
public static void main(String[] args) {
int i = 1;
i = i++;
int j = i++;
int k = i + ++i * i++;
System.out.println(i);
System.out.println(j);
System.out.println(k);
}
最開始看到這題目覺得很簡單佣盒,我以為就是普通的前置++和后置++的問題,沒想到藏著這么多的坑集侯,一開始我算出來的結(jié)果是
i=5,j=2,k=15
怎么算出來的贸毕,i經(jīng)過4次++,所以i為5裆装,j=i++的時候,i為2倡缠,因?yàn)槭呛笾?+哨免,所以賦值后再進(jìn)行++,所以j=2昙沦, k = 3 + 4 * 3 結(jié)果為15琢唾,沒有想到自己全錯了,希望大家引以為戒
本題考點(diǎn)
- JVM虛擬機(jī)關(guān)于指令部分
- 前置++和后置++問題
- 運(yùn)算符的優(yōu)先級
題解
i = i++, 因?yàn)閕入棧之前的值為1盾饮,在棧外++后采桃,局部變量的i的值變?yōu)?懒熙,但是=賦值操作會把棧里面的值賦值給i,所以i的結(jié)果為1
int j = i++; 和上面的i=i++同理普办!
此時i的值為2工扎,然后運(yùn)行如下
int k = i + ++i * i++; =》 2+ 3*3 = 11
i最開始為的值2, i入操作數(shù)棧時 ++i =3衔蹲,此時操作數(shù)的值為3肢娘,而后面的i++,i的值也是為3踪危,所以最終的結(jié)果=11
正確結(jié)果
運(yùn)行結(jié)果為:i=4,j=1,k=11
小結(jié)
- 賦值= 最后計算
- =右邊的從左到右加載值依次壓入操作數(shù)棧
- 實(shí)際先算哪個蔬浙,看運(yùn)算符優(yōu)先級
- 自增猪落、自減操作都是直接修改變量的值贞远,不經(jīng)過操作數(shù)棧
- 最后的賦值之前,臨時結(jié)果也是存儲在操作數(shù)棧中
- 建議:閱讀一下《JVM虛擬機(jī)規(guī)范》關(guān)于指令的部分