亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中的遞增i++與++i的實(shí)現(xiàn)原理詳解

 更新時(shí)間:2023年10月13日 10:42:42   作者:ゞ浪人與酒丶0  
這篇文章主要介紹了Java中的i++與++i的實(shí)現(xiàn)原理詳解,在Java中,i++是一種常見(jiàn)的遞增操作符,用于將變量i的值增加1,它是一種簡(jiǎn)潔且方便的方式來(lái)實(shí)現(xiàn)循環(huán)和計(jì)數(shù)功能,i++可以用于各種情況,本文來(lái)看一下其實(shí)現(xiàn)原理,需要的朋友可以參考下

前言

在Java中,i++是一種常見(jiàn)的遞增操作符,用于將變量i的值增加1。

它是一種簡(jiǎn)潔且方便的方式來(lái)實(shí)現(xiàn)循環(huán)和計(jì)數(shù)功能。i++可以用于各種情況,例如在for循環(huán)中迭代數(shù)組或列表的元素,或者在計(jì)數(shù)器中跟蹤某個(gè)事件的發(fā)生次數(shù)。

通過(guò)使用i++,我們可以輕松地實(shí)現(xiàn)自增操作,而無(wú)需手動(dòng)編寫(xiě)i = i + 1的代碼。

i++

首先先看一段代碼

public class Test {
    public static void main(String[] args) {
        foo();
    }
    public static void foo() {
       int i = 0;
        for (int j = 0; j < 50; j++) {
            i = i++;
        }
        System.out.println(i);
    }
}

執(zhí)行上述代碼輸出結(jié)果是0,而不是50

0

對(duì)應(yīng)字節(jié)碼

public class com.yxzapp.Test {
  public com.yxzapp.Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return
  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #2                  // Method foo:()V
       3: return
  public static void foo();
    Code:
       0: iconst_0
       1: istore_0
       2: iconst_0
       3: istore_1
       4: iload_1
       5: bipush        50
       7: if_icmpge     21
      10: iload_0                           // 把局部變量下標(biāo)0的變量加載到操作數(shù)棧上
      11: iinc          0, 1                // 對(duì)局部變量表表為0的int變量直接加1,但是這												個(gè)時(shí)候棧頂元素沒(méi)有變化,還是0
      14: istore_0 							// 將棧頂元素出棧賦值給局部變量下標(biāo)0變量 也就												是i。 此時(shí) 局部變量 i 又被賦值為0,前面 iinc  											指令對(duì)i 的加一操作一樣被覆蓋
      15: iinc          1, 1
      18: goto          4
      21: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      24: iload_0
      25: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
      28: return
}

image.png

在字節(jié)碼層面是先把 i 加載到操作數(shù)棧上,隨后才對(duì)局部變量 i 執(zhí)行加一操作 , 留在操作數(shù)棧頂?shù)倪€是 i 的舊值。則這個(gè)變量得到的是 i 加一之前的值

++i

public class Test {
    public static void main(String[] args) {
        foo();
    }
    public static void foo() {
       int i = 0;
        for (int j = 0; j < 50; j++) {
            i = ++i;
        }
        System.out.println(i);
    }
}

對(duì)應(yīng)字節(jié)碼

public class com.yxzapp.Test {
  public com.yxzapp.Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return
  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #2                  // Method foo:()V
       3: return
  public static void foo();
    Code:
       0: iconst_0
       1: istore_0
       2: iconst_0
       3: istore_1
       4: iload_1
       5: bipush        50
       7: if_icmpge     21
      10: iinc          0, 1                // 對(duì)局部變量表表為0的int變量直接加1,
      13: iload_0                           // 把局部變量下標(biāo)0的變量加載到操作數(shù)棧上
      14: istore_0                          // 將棧頂元素出棧賦值給局部變量下標(biāo)0變量
      15: iinc          1, 1
      18: goto          4
      21: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      24: iload_0
      25: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
      28: return
}

可以看出 i= ++i , 先對(duì)局部變量表下標(biāo)為0的變量加 1 ,然后才把它加載到操作數(shù)棧上,隨后又從操作數(shù)棧上出棧賦值給局部變量表中下標(biāo)為 0 的變量

image.png

總結(jié) 

  • i++ 即后加加,原理是:先自增,然后返回自增之前的值、
  • ++i 即前加加,原理是:先自增,然后返回自增之后的值

到此這篇關(guān)于Java中的遞增i++與++i的實(shí)現(xiàn)原理詳解的文章就介紹到這了,更多相關(guān)i++與++i的實(shí)現(xiàn)原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java的反射機(jī)制之獲取class詳解

    Java的反射機(jī)制之獲取class詳解

    這篇文章主要介紹了Java的反射機(jī)制之獲取class詳解,Class類(lèi)表示一個(gè)類(lèi)或接口的元數(shù)據(jù),通過(guò)它可以獲取到類(lèi)或接口的構(gòu)造函數(shù)、方法、字段、注解等信息,也能夠創(chuàng)建對(duì)象、調(diào)用方法等,需要的朋友可以參考下
    2023-09-09
  • MybatisX-Generator自動(dòng)代碼生成插件教程

    MybatisX-Generator自動(dòng)代碼生成插件教程

    這篇文章主要介紹了MybatisX-Generator自動(dòng)代碼生成插件教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java+opencv3.2.0實(shí)現(xiàn)hough圓檢測(cè)功能

    Java+opencv3.2.0實(shí)現(xiàn)hough圓檢測(cè)功能

    這篇文章主要為大家詳細(xì)介紹了Java+opencv3.2.0實(shí)現(xiàn)hough圓檢測(cè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 異常點(diǎn)/離群點(diǎn)檢測(cè)算法——LOF解析

    異常點(diǎn)/離群點(diǎn)檢測(cè)算法——LOF解析

    這篇文章主要介紹了異常點(diǎn)/離群點(diǎn)檢測(cè)算法——LOF解析,通過(guò)圖解文字描述的方式詳細(xì)的解析了該算法,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Java中的static的使用指南

    Java中的static的使用指南

    本文給大家簡(jiǎn)單總結(jié)了下java中的static的使用注意事項(xiàng)及方法,非常的實(shí)用,有需要的小伙伴可以參考下
    2016-04-04
  • postman中實(shí)現(xiàn)傳遞@RequestBody參數(shù)

    postman中實(shí)現(xiàn)傳遞@RequestBody參數(shù)

    這篇文章主要介紹了postman中實(shí)現(xiàn)傳遞@RequestBody參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 詳解JVM如何判斷一個(gè)對(duì)象是否可以被回收

    詳解JVM如何判斷一個(gè)對(duì)象是否可以被回收

    在c++中,當(dāng)我們使用完某個(gè)對(duì)象的時(shí)候,需要顯示的將對(duì)象回收,在java中,jvm會(huì)幫助我們進(jìn)行垃圾回收,無(wú)需程序員自己寫(xiě)代碼進(jìn)行回收,下面我們就來(lái)看看JVM是如何判斷一個(gè)對(duì)象是否可以被回收的吧
    2023-11-11
  • vue2向springboot傳值接收不到的解決方法

    vue2向springboot傳值接收不到的解決方法

    本文主要介紹了vue2向springboot傳值接收不到的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • mybatis plus in方法使用說(shuō)明

    mybatis plus in方法使用說(shuō)明

    這篇文章主要介紹了mybatis plus in方法使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • Spring Bean的屬性注入方式

    Spring Bean的屬性注入方式

    這篇文章主要介紹了Spring Bean的屬性注入方式的相關(guān)資料,需要的朋友可以參考下
    2018-02-02

最新評(píng)論