欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

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

通過使用i++,我們可以輕松地實(shí)現(xiàn)自增操作,而無需手動編寫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

對應(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                // 對局部變量表表為0的int變量直接加1,但是這												個時候棧頂元素沒有變化,還是0
      14: istore_0 							// 將棧頂元素出棧賦值給局部變量下標(biāo)0變量 也就												是i。 此時 局部變量 i 又被賦值為0,前面 iinc  											指令對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ù)棧上,隨后才對局部變量 i 執(zhí)行加一操作 , 留在操作數(shù)棧頂?shù)倪€是 i 的舊值。則這個變量得到的是 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);
    }
}

對應(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                // 對局部變量表表為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 , 先對局部變量表下標(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

    MybatisX-Generator自動代碼生成插件教程

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

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

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

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

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

    Java中的static的使用指南

    本文給大家簡單總結(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ù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 詳解JVM如何判斷一個對象是否可以被回收

    詳解JVM如何判斷一個對象是否可以被回收

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

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

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

    mybatis plus in方法使用說明

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

    Spring Bean的屬性注入方式

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

最新評論