前置++和後置++ 運算的詳解及實例代碼。本站提示廣大學習愛好者:(前置++和後置++ 運算的詳解及實例代碼)文章只能為提供參考,不一定能成為您想要的結果。以下是前置++和後置++ 運算的詳解及實例代碼正文
普通以為前置++是先將變量的值加1,然後應用加1後的值介入運算;爾後置++是先應用該值介入運算,然後再將該值加1。
先看第一個例子:
package test; public class Plus_Test01 { public static void main(String[] args) { int i = 100; i = i++; System.out.println(i); } }
猜猜成果是甚麼?
接著看第二個:
package test; public class Plus_Test02 { public static void main(String[] args) { int k = 100; while (true) { if (k++ > 100) { // System.out.println(k); break; } System.out.println(k); } } }
猜猜成果是甚麼?
現實上,不論是前置++,照樣後置++,都是先將變量的值加1,然後才持續盤算的。兩者之間真實的差別是:前置++是將變量的值加1後,應用增值後的變量停止運算的,爾後置++是起首將變量賦值給一個暫時變量,接上去對變量的值加1,然後應用誰人暫時變量停止運算。
關於以下代碼片斷(前置++):
int i=1;
int j=++i*5;
現實第二句上相當於:
i+=1; //將i加1
j=i*5; //將加1後的值與之停止盤算, 此成果為:10
而關於以下代碼片斷(後置++):
int i=1;
int j=i++*5;
第二句上相當於:
int temp=i; // 將i賦值給一個暫時變量
i+=1; //將i加1
j=temp*5; //將暫時變量與之盤算, 此成果為:5
關於第一個例子,相當於:
int temp=i;
i+=1;
i=temp; //
所以成果應當為不變的,即100。
第一個例子的匯編代碼為:
public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=2, locals=2, args_size=1 0: bipush 100 2: istore_1 3: iload_1 4: iinc 1, 1 //local var中第二個 加1 7: istore_1 //保留至local var 8: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream; 11: iload_1 //加載的參數為棧中的第二個,即依然為100 12: invokevirtual #22 // Method java/io/PrintStream.println:(I)V 15: return
關於第二個例子,其實不難,成果是101,留意看一下賤程,今後不克不及在犯如許的毛病了。(流程為:起首比擬temp=i,temp>100,,明顯不成立,將i+=1,跳到syso那一句,打印確當然是101,再次輪回異樣有temp=i,temp>100,此次是成立的,然後i+=1,直接跳出輪回,不會履行while外面的語句)。
第二個例子的匯編(只拔取了main辦法):
public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=2, locals=2, args_size=1 0: bipush 100 //100壓棧 2: istore_1 //保留至第二個local var(第一個local var 是辦法參數) 3: iload_1 //從第二個local var加載 4: iinc 1, 1 //給local var的2號地位的int值增長1(部分變量自增,成果依然在local var中,操作數棧頂1不會變) 7: bipush 100 //100壓棧 9: if_icmple 15 //比擬操作數棧頂的兩個int整型值,假如第一個小於或許等於第二個的話,然後跳轉到15行 12: goto 25 //不然跳轉到25行(即操作數棧頂1>操作數棧頂2) 15: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 18: iload_1 // //從第一個個local var加載 19: invokevirtual #3 // Method java/io/PrintStream.println:(I)V //挪用該辦法 22: goto 3 //再次回跳至3,再次輪回 25: return //加入
第三個例子:
package test; public class Plus_Test03 { static int proPlus() { int i = 55; int j = ++i; return j; //56 } static int postPlus() { int i = 55; int j = i++; return j; //55 } public static void main(String[] args) { System.out.println(proPlus());//56 System.out.println(postPlus());//55 } }
第三個例子的匯編:
static int proPlus(); descriptor: ()I flags: ACC_STATIC Code: stack=1, locals=2, args_size=0 0: bipush 55 //55壓棧 2: istore_0 //將int型棧頂的存儲至第一個local var 3: iinc 0, 1 //第一個local var加1 6: iload_0 //從local var加載 7: istore_1 //保留至第二個local var 8: iload_1 //棧頂為第二個local var 9: ireturnstatic int postPlus(); descriptor: ()I flags: ACC_STATIC Code: stack=1, locals=2, args_size=0 0: bipush 55 2: istore_0 3: iload_0 //加載至棧 4: iinc 0, 1 //第一個local var加1 7: istore_1 8: iload_1 9: ireturn
可見,前置++ 和後置++的分歧點在於下面藍色(//第一個local var加1)的部門,這兩部門是反過去的。關於前置來講,會將local var中的數加1然後加載至棧中,爾後置則是先從棧local var中加載至棧,然後將local var的加1,相當於留了一個備份。
結論:
一。前置、與後置++都是先將變量的值加1,而不是前置++先加1然後運算,爾後置++先運算後加1。
二。從法式上說,後置++先將變量賦值給一個暫時變量,然後將變量的值加1,接上去應用誰人暫時變量介入運算。
三。從指令上說,後置++在履行增值指令(iinc)前,先將變量的值壓入棧,履行增值指令後,應用的是之前壓入棧的值。
願望經由過程此文,完全懂得前置++和後置++的運算差別,感謝年夜家對本站的支撐!