1. 程式人生 > >JVM 使用javap反編譯命令解釋i++和++i的區別

JVM 使用javap反編譯命令解釋i++和++i的區別

一個簡單的例子

public class Test{
    public static void main(String[] args){
        int i = 0;
        int j = 1;
        int k = 2;
        i = i++;        
        j = ++j;
        k += 2;
    }
}

輸出結果我們知道是

0
2
4

使用javap命令反編譯一下

這裡寫圖片描述

分析一下得到的輸出結果

public static void main(java.lang.String[]);
    Code:
       0
: iconst_0 1: istore_1 2: iconst_1 3: istore_2 4: iconst_2 5: istore_3 6: iload_1 7: iinc 1, 1 10: istore_1 11: iinc 2, 1 14: iload_2 15: istore_2 16: iinc 3, 2 19: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
22: iload_1 23: invokevirtual #3 // Method java/io/PrintStream.println:(I)V 26: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 29: iload_2 30: invokevirtual #3 // Method java/io/PrintStream.println:(I)V 33
: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 36: iload_3 37: invokevirtual #3 // Method java/io/PrintStream.println:(I)V 40: return }

前面6條指令分別給i,j,k變數進行賦值,即
0: iconst_0—–把常量0入棧
1: istore_1——把棧頂元素(0)存入第一個變數i中
2: iconst_1—–把常量1入棧
3: istore_2—–把棧頂元素(1)存入第二個變數j中
4:iconst_2—–把常量2入棧
5: istore_3—–把棧頂元素(2)存入第三個變數k中

接下來的
6,7,10對應的程式碼是i = i++;
6: iload_1——把第一個變數的值壓入棧
7:iinc 1, 1——第一個變數的值加1
10: istore_1——把棧頂元素存入第一個變數i

我們可以知道這裡的操作類似於

int temp = i;
i = i+1;
i = temp;

因此i的值並沒有發生變化

11,14,15對應的是j = ++j;

11: iinc 2, 1—–把第二個變數j的值加1
14: iload_2—-把第二個變數是j的值壓入棧
15: istore_2—-把棧頂元素存入第二個變數j中

操作類似於

i = i+1;
int temp = i;
i = temp;

j的值是發生了改變的

16對應的就是k += 2;

16: iinc 3, 2—把第三變數的值加二

因此k的值是4

相關推薦

JVM 使用javap編譯命令解釋i++++i區別

一個簡單的例子 public class Test{ public static void main(String[] args){ int i = 0; int j = 1; int k = 2;

Java jvm 載入機制及 其中解釋執行編譯執行的區別

jvm載入機制 https://www.cnblogs.com/Qian123/p/5707562.html https://www.cnblogs.com/lingz/archive/2018/07/31/9394238.html 以前有句話說:“Java是解釋執行的 ” 。現在看

javap 編譯Atomicity 1.5.0_221.8.0_111的區別

jdk1.5.0_22環境下使用javacp -c Atomicity.class反編譯不成功,提示ERROR:Could not find Atomicity.class,但使用javacp -c Atomicity可反編譯成功; jdk1.8.0_111環境下使用javacp -c

Java 編譯命令javap

javap是jdk自帶的一個工具,可以對程式碼反編譯,也可以檢視java編譯器生成的位元組碼。 一般情況下,很少有人使用javap對class檔案進行反編譯,因為有很多成熟的反編譯工具可以使用,比如jad。但是,javap還可以檢視java編譯器為我們生成的位元組碼

Apk編譯工具檢視layout java原始碼的工具

首先要準備反編譯三件套,這個在網上應該會有很多 一: 檢視layout        解壓得到apktol.jar 和 apktool.bat 同時把要反編譯的apk也一起存放在當前目錄下 然後開啟控制檯  cmd 定位到當前目錄下

Java中的String,javap&cfr.jar編譯javap編譯後二進位制指令程式碼詳解,Java8常量池的位置

一個例子   public class TestString{ public static void main(String[] args){ String a = "a"; String b = a+"b";

Android kotlinjava編譯後的smali 有什麼區別

kotlin反編譯後的smali 有什麼區別? 以前有使用過Kotlin,後來覺得不習慣就放棄了,編譯速度也讓我有點蛋蛋的憂傷,直到今天谷歌承認之後,才對它有了點希望。 逆向的同學比較關心一個問題,“Kotlin編譯出來的smail和java編譯出來

JavaScript運算符:遞增遞減(++i,--i i++,i-- 的區別)

nbsp key mic comment 包含 -- 效應 1+n com 遞增和遞減操作符直接借鑒自C,而且各有兩個版本:前置型 (遞增 ++i ,遞減 --i )和 後置型 (遞增 i++ ,遞減 i-- )。書本上對兩者的定義是:前置型應該位於要操作的變量之前,而後置

js ++ii++的區別

bsp ons http pre sans 前綴 -h 單位 alt ++i和i++的定義:   1. 如果用前綴運算符對一個變量增1(減1),則在將該變量增1(減1)後,用新值在表達式中進行其他的運算。   2. 如果用後綴運算符對一個變量增1(減1),則用該變量的

i++++i區別

++i ++ 輸出結果 print body nbsp pos 之前 ont 1.  i++為後自增 整體表達式的值為自增之前的值 2.  ++i為前自增 整體表達式的值為自增後的值 # include <stdio.h> int main(void)

自增自減 i++ ++i區別

post 宋體 font clas style span 與運算 rom ++ ◆在不參與運算的情況下,i++和++i都是在變量的基礎加1 ◆在參與運算的情況下 Var i=123; Var j=i++; 先將i的值123賦值給j,之後再自增 j的值為123 i

20180514 ++ii++

pre 報錯 bsp std cin key padding char 定義 函數func的定義如下: 1 2 3 4 5 void func(const int& v1, cont int& v2) { std::cout <

++ii++的區別

比較 word comm nbsp 引用 x11 AR 常見 循環 ++i和i++區別在於運算順序和結合方向。 js中有兩種自加運算,其運算符均為++,功能為將運算符自加1. 其中: ++VAR被稱為前自加,其後面的變量執行自加操作,其運算為,先執行自加操作,再引用VA

js中 i++ ++i區別

alt nts 表達 i++ ring string pla line class i++ 是先引用再自增; ++i是先自增再引用; int i,x; i = 1; x = 1; x = i ++;      //先讓x變成i的值1,再讓i加1 prin

關於Java中for循環的i++++i區別

信息 執行c println 耗時 實例 空間 申請 開始 for 我們應該都知道i++和++i的區別是: ++i是先執行 i = i +1 再使用 i 的值,而 i++ 是先使用 i 的值再執行 i = i + 1; for循環的執行順序如下: for(a;b;c) {

簡介一下 i++++i&&i=i+i,i+=1;的區別

text 的區別 pan 表示 復合 mil mod 當前 resolv 首先: int i=2; i++=2; ++i=3; 前者先顯示當前的值,而後者則是先自增在顯示值; second i=i+1和i+=1; 輸出結果雖然一樣,但是 1.byte i=2; i+=2

i++++i

++i 我們 一行 ron 百度 let 進行 就是 oot i++和++1 概述:i++和++i 這個問題困擾了我很長時間,在這段時間裏自己不止一次的懷疑自己的智商,難道自己對編程一點天賦都沒有嗎?此問題嚴重打擊了我的自信心.......也曾苦苦暗自琢磨,也曾百度谷歌瘋狂

Js 中的i++ ++i區別

... ons 不同 減法 是不是 pre 簡單 前置 進行 首先碰見 i++ 和 ++i 會一臉蒙蔽 感覺沒什麽區別,都是相加 , 但是 輸出的值是不同!!! 來奉上代碼來進行比較 var i = 1; var a = i++; //a = 1; 此時i為2,但賦

JS 中 ++i i++的區別

【首先】從自身來看,++i 和 i++都 等同於 i = i + 1; 【但是一般情況下】,它們都是跟賦值聯絡在一起。 比如: var a ; a = i ++ //將i的值賦給a , 即a = i,之後再執行i = i + 1; a = ++ i //將i+1 的值賦給a,即a = i + 1 ,

簡論++ii++

                                        &n