程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 前置++和後置++ 運算的詳解及實例代碼

前置++和後置++ 運算的詳解及實例代碼

編輯:關於JAVA

前置++和後置++ 運算的詳解及實例代碼。本站提示廣大學習愛好者:(前置++和後置++ 運算的詳解及實例代碼)文章只能為提供參考,不一定能成為您想要的結果。以下是前置++和後置++ 運算的詳解及實例代碼正文


普通以為前置++是先將變量的值加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)前,先將變量的值壓入棧,履行增值指令後,應用的是之前壓入棧的值。

願望經由過程此文,完全懂得前置++和後置++的運算差別,感謝年夜家對本站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved