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_22和1.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 kotlin和java反編譯後的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 ++i和i++的區別
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 ++i和i++
pre 報錯 bsp std cin key padding char 定義 函數func的定義如下: 1 2 3 4 5 void func(const int& v1, cont int& v2) { std::cout <
++i和i++的區別
比較 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 ,
簡論++i和i++
&n