【JVM】javap命令行分析(a++ + ++a)的虚拟机指令
源代碼
public class PlusTest {public static void main(String[] args) {int a = 2;System.out.println(a++ + ++a);} }編譯
>javac PlusTest.java執行
>java PlusTest 6反匯編
>javap -c PlusTest Compiled from "PlusTest.java" public class PlusTest {public PlusTest();Code:0: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: returnpublic static void main(java.lang.String[]);Code:0: iconst_21: istore_12: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;5: iload_16: iinc 1, 19: iinc 1, 112: iload_113: iadd14: invokevirtual #3 // Method java/io/PrintStream.println:(I)V17: return }main()的虛擬機指令分析
iconst_2上面的指令表示先生成一個常量,值為2。
istore_1上面的指令表示將常量2賦值給第一個變量(在jshell里就是$1)
getstatic由于System.out.println()其中的System.out其實是java.lang.System中的一個靜態的屬性,所以這個指令顧名思義,就是獲取這樣一個靜態屬性。
這個System.out的類型其實是java.io.PrintStream,這點我們在之前的文章中也說過了,感興趣的可以查看源碼自行了解。
上面的指令表示將$1(也就是a)這個變量裝到??臻g上。
iinc 1, 1上面的指令全稱應該是iincrease,是a++的指令表示,此時$2=$1+1=3。
iinc 1, 1再執行一次iinc,這是++a的指令表示,此時$3=$2+1=4。
iload_1將$3壓棧,加到虛擬機??臻g中。
iadd學過數據結構的棧就應該知道棧的應用——計算后綴表達式。
這個指令就是把棧空間棧頂兩個整數彈出棧并求和,$4=$3+$1=2+4=6。
調用System.out的println(),打印$4的值,輸出6。
returnmain()返回值為void,使用return結束方法,相當于C/C++中int main()最后的return 0。
結論
所以說:a++ + ++a;的運算過程就是執行a++,再把這個值++a,此時原本棧中的變量還是2,并不受影響,只是新的變量相當于經歷了2次+1運算。最終將兩個棧中變量相加求和。
總結
還是那句話,最好不要濫用++,導致程序亂七八糟,但如果有什么疑惑,可以打開javap命令去分析一下反匯編指令,一切盡在不言之中。
總結
以上是生活随笔為你收集整理的【JVM】javap命令行分析(a++ + ++a)的虚拟机指令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数据结构与算法】二叉堆V2.0的Jav
- 下一篇: 【C语言】数组和指针相关 * 和 总结