分享一道經典的Java計算題,分享的同時也幫助基礎薄弱的自己進一步加深理解:
附上代碼:
package com.java_foundation.arithmetic;
public class ClassicalCalculation_1 {
public static void main(String[] args) {
int i = 1;
i = i++;
int j = i++;
int k = i+ ++i * i++;
System.out.println("i="+i);
System.out.println("j="+i);
System.out.println("k="+i);
}
}
可以先自己想一下輸出的是什麼 ?
idea打開ViewàShow ByteCode,查看下字節碼指令,通過字節碼來分析它的整個運行流程,這裏我大致分析了下過程,總結了爲下圖。
輸出:
i=4
j=1
k=11
小結:
1、賦值=是最後計算的
2、=號右邊的從左到右加載值依次壓入操作數棧
3、實際先算哪個需要根據運算符的優先級來判定
4、自增、自減操作都是直接修改變量的值,不經過操作數棧,這裏是誤解比較大的地方
5、最後的賦值之前,臨時結果也是存儲在操作數棧中