<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # i++和++i的區別 ```java int i = 1; int j1 = i++; // 先將i的原始值(1)賦值給變量j1(1),然后i變量的值加1 int j1 = ++i; // 先將i變量的值加1,然后將i的當前值(2)賦值給變量j1(2) ``` # 實現原理 源代碼如下: ```java public class Test { public void testIPlus() { int i = 0; int j = i++; } public void testPlusI() { int i = 0; int j = ++i; } } ``` 經`javap`反編譯后查看字節碼如下: ```java { public Test(); descriptor: ()V flags: ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 1: 0 public void testIPlus(); descriptor: ()V flags: ACC_PUBLIC Code: stack=1, locals=3, args_size=1 0: iconst_0 // 生成整數0 1: istore_1 // 將整數0賦值給1號存儲單元(即變量i) 2: iload_1 // 將1號存儲單元的值加載到數據棧(此時 i=0,棧頂值為0) 3: iinc 1, 1 // 1號存儲單元的值+1(此時 i=1) 6: istore_2 // 將數據棧頂的值(0)取出來賦值給2號存儲單元(即變量j,此時i=1,j=0) 7: return // 返回時:i=1,j=0 LineNumberTable: line 4: 0 line 5: 2 line 6: 7 public void testPlusI(); descriptor: ()V flags: ACC_PUBLIC Code: stack=1, locals=3, args_size=1 0: iconst_0 // 生成整數0 1: istore_1 // 將整數0賦值給1號存儲單元(即變量i) 2: iinc 1, 1 // 1號存儲單元的值+1(此時 i=1) 5: iload_1 // 將1號存儲單元的值加載到數據棧(此時 i=1,棧頂值為1) 6: istore_2 // 將數據棧頂的值(1)取出來賦值給2號存儲單元(即變量j,此時i=1,j=1) 7: return // 返回時:i=1,j=1 LineNumberTable: line 9: 0 line 10: 2 line 11: 7 } ``` 可以看到,區別在于第三步和第四部的順序問題: * i++先執行`iload_1`,再執行`iinc`,也就是先將1號存儲單元的值加載到數據棧,再將1號存儲單元的值+1 * ++i先執行`iinc`,再執行`iload_1`,也就先將1號存儲單元的值+1,再將1號存儲單元的值加載到數據棧 執行完這兩步后,將數據棧頂的值取出賦值給2號存儲單元,也就是賦值給j。 # 實戰 那么看看接下來的兩個例子會輸出什么呢 代碼1: ```java public static void main(String[] args) { int a = 0; for (int i = 0; i < 99; i++) { a = a++; } System.out.print(a); } ``` 代碼2: ```java public static void main(String[] args) { int a = 0; for (int i = 0; i < 99; i++) { a = ++a; } System.out.print(a); } ``` 在代碼`a = a++`處IDE會提示`The value changed at 'a++' is never used `,也就是說a加1后的值從來沒有被使用到。 那么我們來看看什么兩個代碼片段的執行結果: 代碼1: ```plain 0 Process finished with exit code 0 ``` 代碼2: ```plain 99 Process finished with exit code 0 ``` ***** 接下來我們從字節碼角度看看為什么會這樣,編寫一個簡單的代碼片段: ```java int i = 0; i = i++; System.out.println("i=" + i); // 輸出 i=0 ``` 編譯后查看字節碼如下: ```java 0: iconst_0 // 生成整數0 1: istore_1 // 將整數0賦值給1號存儲單元(即變量i,i=0) 2: iload_1 // 將1號存儲單元的值加載到數據棧(此時 i=0,棧頂值為0) 3: iinc 1, 1 // 1號存儲單元的值+1(此時 i=1) 6: istore_1 // 將數據棧頂的值(0)取出來賦值給1號存儲單元(即變量i,此時i=0) 7: getstatic #16 // 下面是打印到控制臺指令 10: new #22 13: dup 14: ldc #24 16: invokespecial #26 19: iload_1 20: invokevirtual #29 23: invokevirtual #33 26: invokevirtual #37 29: return ``` 可以看到,對于代碼`i = i++;`,在給1號存儲單元賦值后,先將1號存儲單元的值加載到數據棧,再將1號存儲單元的值+1,然后再**將數據棧頂的值(0)取出來賦值給1號存儲單元**。 因此在上面a++循環99次后,a的值依舊是0. # 總結 * i++會先使用i的值,也就是將i的值加載到數據棧,在給i加1,最后使用數據棧中的值。 * ++i會先將i的值加1,再將增加后的值加載到數據棧,再使用數據棧中的值。 # 參考 [深入理解Java中的i++、++i語句](https://blog.csdn.net/xialei199023/article/details/76383013)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看