最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

前置++和后置++ 運(yùn)算的詳解及實(shí)例代碼

 更新時(shí)間:2016年09月18日 14:42:34   投稿:lqh  
這篇文章主要介紹了前置++和后置++ 的相關(guān)資料,并附示例代碼,幫助大家學(xué)習(xí)參考,需要的朋友可以參考下

一般認(rèn)為前置++是先將變量的值加1,然后使用加1后的值參與運(yùn)算;而后置++是先使用該值參與運(yùn)算,然后再將該值加1。

先看第一個(gè)例子:

package test;
public class Plus_Test01 {
 public static void main(String[] args) {
  int i = 100;
  i = i++;
  System.out.println(i);
 }
}

猜猜結(jié)果是什么?

接著看第二個(gè):

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);
  }
 }
}

猜猜結(jié)果是什么?

實(shí)際上,不管是前置++,還是后置++,都是先將變量的值加1,然后才繼續(xù)計(jì)算的。二者之間真正的區(qū)別是:前置++是將變量的值加1后,使用增值后的變量進(jìn)行運(yùn)算的,而后置++是首先將變量賦值給一個(gè)臨時(shí)變量,接下來對(duì)變量的值加1,然后使用那個(gè)臨時(shí)變量進(jìn)行運(yùn)算。

對(duì)于如下代碼片段(前置++):

int i=1;
int j=++i*5;

實(shí)際第二句上相當(dāng)于:

i+=1; //將i加1
j=i*5; //將加1后的值與之進(jìn)行計(jì)算, 此結(jié)果為:10

而對(duì)于如下代碼片段(后置++):

int i=1;
int j=i++*5;

第二句上相當(dāng)于:

int temp=i;  // 將i賦值給一個(gè)臨時(shí)變量
i+=1;        //將i加1
j=temp*5;   //將臨時(shí)變量與之計(jì)算, 此結(jié)果為:5

對(duì)于第一個(gè)例子,相當(dāng)于:

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

所以結(jié)果應(yīng)該為不變的,即100。

第一個(gè)例子的匯編代碼為:

 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中第二個(gè) 加1
   7: istore_1    //保存至local var
   8: getstatic  #16     // Field java/lang/System.out:Ljava/io/PrintStream;
   11: iload_1 //加載的參數(shù)為棧中的第二個(gè),即仍然為100
   12: invokevirtual #22     // Method java/io/PrintStream.println:(I)V
   15: return

對(duì)于第二個(gè)例子,其實(shí)不難,結(jié)果是101,注意看一下流程,以后不能在犯這樣的錯(cuò)誤了。(流程為:首先比較temp=i,temp>100,,顯然不成立,將i+=1,跳到syso那一句,打印的當(dāng)然是101,再次循環(huán)同樣有temp=i,temp>100,這次是成立的,然后i+=1,直接跳出循環(huán),不會(huì)執(zhí)行while里面的語句)。

第二個(gè)例子的匯編(只選取了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     //保存至第二個(gè)local var(第一個(gè)local var 是方法參數(shù))
   3: iload_1     //從第二個(gè)local var加載
   4: iinc   1, 1  //給local var的2號(hào)位置的int值增加1(局部變量自增,結(jié)果仍然在local var中,操作數(shù)棧頂1不會(huì)變)
   7: bipush  100 //100壓棧
   9: if_icmple  15 //比較操作數(shù)棧頂?shù)膬蓚€(gè)int整型值,如果第一個(gè)小于或者等于第二個(gè)的話,然后跳轉(zhuǎn)到15行
   12: goto   25 //否則跳轉(zhuǎn)到25行(即操作數(shù)棧頂1>操作數(shù)棧頂2)
   15: getstatic  #2     // Field java/lang/System.out:Ljava/io/PrintStream;
   18: iload_1 // //從第一個(gè)個(gè)local var加載
   19: invokevirtual #3     // Method java/io/PrintStream.println:(I)V //調(diào)用該方法
   22: goto   3 //再次回跳至3,再次循環(huán)
   25: return //退出

第三個(gè)例子:

 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
 
  }
}

第三個(gè)例子的匯編:

static int proPlus();
 descriptor: ()I
 flags: ACC_STATIC
 Code:
  stack=1, locals=2, args_size=0
   0: bipush  55 //55壓棧
   2: istore_0   //將int型棧頂?shù)拇鎯?chǔ)至第一個(gè)local var
   3: iinc   0, 1 //第一個(gè)local var加1
   6: iload_0   //從local var加載
   7: istore_1  //保存至第二個(gè)local var
   8: iload_1   //棧頂為第二個(gè)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 //第一個(gè)local var加1
   7: istore_1
   8: iload_1
   9: ireturn

可見,前置++ 和后置++的不同點(diǎn)在于上面藍(lán)色(//第一個(gè)local var加1)的部分,這兩部分是反過來的。對(duì)于前置來說,會(huì)將local var中的數(shù)加1然后加載至棧中,而后置則是先從棧local var中加載至棧,然后將local var的加1,相當(dāng)于留了一個(gè)備份。

結(jié)論:

一。前置、與后置++都是先將變量的值加1,而不是前置++先加1然后運(yùn)算,而后置++先運(yùn)算后加1。
二。從程序上說,后置++先將變量賦值給一個(gè)臨時(shí)變量,然后將變量的值加1,接下來使用那個(gè)臨時(shí)變量參與運(yùn)算。
三。從指令上說,后置++在執(zhí)行增值指令(iinc)前,先將變量的值壓入棧,執(zhí)行增值指令后,使用的是之前壓入棧的值。

希望通過此文,徹底理解前置++和后置++的運(yùn)算區(qū)別,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • java設(shè)計(jì)模式之實(shí)現(xiàn)對(duì)象池模式示例分享

    java設(shè)計(jì)模式之實(shí)現(xiàn)對(duì)象池模式示例分享

    對(duì)象池模式經(jīng)常用在頻繁創(chuàng)建、銷毀對(duì)象(并且對(duì)象創(chuàng)建、銷毀開銷很大)的場景,比如數(shù)據(jù)庫連接池、線程池、任務(wù)隊(duì)列池等。本代碼簡單,沒有限制對(duì)象池大小
    2014-02-02
  • springboot整合mybatis-plus基于注解實(shí)現(xiàn)一對(duì)一(一對(duì)多)查詢功能

    springboot整合mybatis-plus基于注解實(shí)現(xiàn)一對(duì)一(一對(duì)多)查詢功能

    這篇文章主要介紹了springboot整合mybatis-plus基于純注解實(shí)現(xiàn)一對(duì)一(一對(duì)多)查詢功能,因?yàn)楸救瞬捎玫氖莝pring-boot進(jìn)行開發(fā),本身springboot就提倡采用不用配置自動(dòng)配置的方式,所以真心希望mybatis(不是mybatis-plus)這點(diǎn)需要繼續(xù)努力
    2021-09-09
  • Netty中ChannelPoolHandler調(diào)用處理程序詳解

    Netty中ChannelPoolHandler調(diào)用處理程序詳解

    這篇文章主要介紹了Netty中ChannelPoolHandler調(diào)用處理程序詳解,Netty 是基于 Java NIO 的異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用框架,使用 Netty 可以快速開發(fā)網(wǎng)絡(luò)應(yīng)用,Netty 提供了高層次的抽象來簡化 TCP 和 UDP 服務(wù)器的編程,但是你仍然可以使用底層的 API,需要的朋友可以參考下
    2023-11-11
  • FreeSWITCH跨NAT部署配置詳解

    FreeSWITCH跨NAT部署配置詳解

    這篇文章主要為大家介紹了FreeSWITCH跨NAT部署配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Spring boot 集成Dubbox的方法示例

    Spring boot 集成Dubbox的方法示例

    本篇文章主要介紹了Spring boot 集成Dubbox的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • Java中十六進(jìn)制和十進(jìn)制之間互相轉(zhuǎn)換代碼示例

    Java中十六進(jìn)制和十進(jìn)制之間互相轉(zhuǎn)換代碼示例

    這篇文章主要給大家介紹了關(guān)于Java中十六進(jìn)制和十進(jìn)制之間互相轉(zhuǎn)換的相關(guān)資料,我們項(xiàng)目過程中總是要用到十進(jìn)制與十六進(jìn)制相互轉(zhuǎn)換的方法,需要的朋友可以參考下
    2023-07-07
  • Java中MapStruct對(duì)象映射的實(shí)現(xiàn)

    Java中MapStruct對(duì)象映射的實(shí)現(xiàn)

    MapStruct是一種Java實(shí)體類映射框架,本文就來介紹一下Java中MapStruct對(duì)象映射的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-12-12
  • Java中文件的操作與輸入輸出流舉例詳解

    Java中文件的操作與輸入輸出流舉例詳解

    Java語言的輸入輸出功能是十分強(qiáng)大而靈活的,下面這篇文章主要給大家介紹了關(guān)于Java中文件的操作與輸入輸出流的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • MyBatis中#和$的區(qū)別小結(jié)

    MyBatis中#和$的區(qū)別小結(jié)

    ${} 和 #{} 都是 MyBatis 中用來替換參數(shù)的,它們都可以將用戶傳遞過來的參數(shù),替換到 MyBatis 最終生成的 SQL 中,但它們區(qū)別卻是很大的,接下來我們一起來看
    2023-09-09
  • 使用Java實(shí)現(xiàn)系統(tǒng)托盤功能的介紹(附源碼以及截圖)

    使用Java實(shí)現(xiàn)系統(tǒng)托盤功能的介紹(附源碼以及截圖)

    本篇文章介紹了,在Java中實(shí)現(xiàn)系統(tǒng)托盤功能的詳解,文中附源碼以及截圖介紹。需要的朋友參考下
    2013-05-05

最新評(píng)論

永吉县| 馆陶县| 格尔木市| 柳河县| 抚顺县| 新巴尔虎右旗| 神农架林区| 南澳县| 嘉鱼县| 中牟县| 栖霞市| 阿瓦提县| 蒲江县| 九台市| 小金县| 集贤县| 蕉岭县| 榆中县| 阿拉善盟| 临湘市| 精河县| 安陆市| 东丰县| 洪江市| 安国市| 凤阳县| 和林格尔县| 临高县| 永仁县| 遂宁市| 贵德县| 洱源县| 乐昌市| 瑞安市| 昭苏县| 台南市| 咸丰县| 天水市| 罗江县| 青川县| 乌鲁木齐市|