<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何解釋i++和++i的真正區(qū)別 ?

          共 13736字,需瀏覽 28分鐘

           ·

          2021-08-26 10:18

          點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)

          前言

          如果只用普通的知識(shí)解釋i++和++i的話

          • i++ 先將i賦值再++
          • ++i 先++再賦值

          但是這簡(jiǎn)單的回答并不能入吸引面試官的眼球,如果用java字節(jié)碼指令分析則效果完全不同。

          代碼實(shí)現(xiàn)

          public class OperandStackTest {
          /**
              程序員面試過(guò)程中, 常見(jiàn)的i++和++i 的區(qū)別
               */

              public static void add(){
                  //第1類(lèi)問(wèn)題:
                  int i1 = 10;
                  i1++;
                  System.out.println(i1);//11

                  int i2 = 10;
                  ++i2;
                  System.out.println(i2);//11

                  //第2類(lèi)問(wèn)題:
                  int i3 = 10;
                  int i4 = i3++;
                  System.out.println(i3);//11
                  System.out.println(i4);//10

                  int i5 = 10;
                  int i6 = ++i5;
                  System.out.println(i5);//11
                  System.out.println(i6);//11

                  //第3類(lèi)問(wèn)題:
                  int i7 = 10;
                  i7 = i7++;
                  System.out.println(i7);//10

                  int i8 = 10;
                  i8 = ++i8;
                  System.out.println(i8);//11

                  //第4類(lèi)問(wèn)題:
                  int i9 = 10;
                  int i10 = i9++ + ++i9;//10+12
                  System.out.println(i9);//12
                  System.out.println(i10);//22
              }

              public static void main(String[] args) {
                  add();
              }
          }

          運(yùn)行結(jié)果

          字節(jié)碼指令

          通過(guò)javap -v out目錄下的class文件名 在終端運(yùn)行得到如下結(jié)果

           public static void add();
              descriptor: ()V
              flags: ACC_PUBLIC, ACC_STATIC
              Code:
                stack=2, locals=10, args_size=0
                   0: bipush        10
                   2: istore_0
                   3: iinc          01
                   6: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
                   9: iload_0
                  10: invokevirtual #5                  // Method java/io/PrintStream.println:(I)V
                  13: bipush        10
                  15: istore_1
                  16: iinc          11
                  19: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
                  22: iload_1
                  23: invokevirtual #5                  // Method java/io/PrintStream.println:(I)V
                  26: bipush        10
                  28: istore_2
                  29: iload_2
                  30: iinc          21
                  33: istore_3
                  34: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
                  37: iload_2
                  38: invokevirtual #5                  // Method java/io/PrintStream.println:(I)V
                  41: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
                  44: iload_3
                  45: invokevirtual #5                  // Method java/io/PrintStream.println:(I)V
                  48: bipush        10
                  50: istore        4
                  52: iinc          41
                  55: iload         4
                  57: istore        5
                  59: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
                  62: iload         4
                  64: invokevirtual #5                  // Method java/io/PrintStream.println:(I)V
                  67: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
                  70: iload         5
                  72: invokevirtual #5                  // Method java/io/PrintStream.println:(I)V
                  75: bipush        10
                  77: istore        6
                  79: iload         6
                  81: iinc          61
                  84: istore        6
                  86: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
                  89: iload         6
                  91: invokevirtual #5                  // Method java/io/PrintStream.println:(I)V
                  94: bipush        10
                  96: istore        7
                  98: iinc          71
                 101: iload         7
                 103: istore        7
                 105: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
                 108: iload         7
                 110: invokevirtual #5                  // Method java/io/PrintStream.println:(I)V
                 113: bipush        10
                 115: istore        8
                 117: iload         8
                 119: iinc          81
                 122: iinc          81
                 125: iload         8
                 127: iadd
                 128: istore        9
                 130: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
                 133: iload         8
                 135: invokevirtual #5                  // Method java/io/PrintStream.println:(I)V
                 138: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
                 141: iload         9
                 143: invokevirtual #5                  // Method java/io/PrintStream.println:(I)V
                 146return

          解釋以上運(yùn)行結(jié)果

          第一類(lèi)問(wèn)題

          對(duì)應(yīng)的指令為

          先將i1的值為10入棧(bipush),然后將int類(lèi)型的值從棧中存到局部變量表0的位置,然后執(zhí)行iinc將0位置的值+1,然后將局部變量表0位置的數(shù)入棧執(zhí)行輸出操作

          所以i1的值為11

          先將i2的值為10入棧(bipush),然后將int類(lèi)型的值從棧中存到局部變量表1的位置,然后執(zhí)行iinc將1位置的值+1,然后將局部變量表1位置的數(shù)入棧執(zhí)行輸出操作

          所以i2的值為11

          總結(jié)

          由于沒(méi)有賦值操作,區(qū)別不大。

          第二類(lèi)問(wèn)題

          先將i3入棧存儲(chǔ)到局部變量表2的位置,然后將它入棧,執(zhí)行iinc將2位置的值加一,i4存儲(chǔ)到局部表量表3的位置

          所以i3是11,i4還是10

          將i5入棧存儲(chǔ)到局部變量表4的位置,由于是++i所以先iinc將4位置的值加一,然后將局部變量表4的值入棧,執(zhí)行賦值操作,所以都是11

          第三類(lèi)問(wèn)題

          先將i7入棧,然后存到局部變量表6的位置,先把i6入棧,然后把6處的值加一,由于又將這個(gè)值存儲(chǔ)到局部變量表6處,所以產(chǎn)生覆蓋又把值變?yōu)?0。

          而++i不會(huì)產(chǎn)生覆蓋先執(zhí)行加一然后再把值入棧,在賦值給局部變量表中,所以i8為11。

          第四類(lèi)問(wèn)題

          先將i9=10入棧,然后存在局部變量表8的位置

          int i10 = i9++ + ++i9;

          先iload將8位置的i9入棧然后執(zhí)行iinc將8處的i9加一,然后執(zhí)行++i9,在將8處的i9加一

          此時(shí)i9=10+1+1為12,然后將8位置的i9入棧,執(zhí)行add將棧中的兩i9相加,得到的值存儲(chǔ)到局部變量表9的位置

          所以i10=10+12(i9++后還是10,++i9后是12,因?yàn)閳?zhí)行了兩次iinc操作)

          然后調(diào)用虛方法和靜態(tài)方法,在將9處的值入棧執(zhí)行輸出語(yǔ)句

          (感謝閱讀,希望對(duì)你所有幫助)
          來(lái)源:https://blog.csdn.net/weixin_45706762/

          (完)




          加我"微信獲取一份 最新Java面試題資料

          請(qǐng)備注:666,不然不通過(guò)~


          最近好文


          1、Spring Boot 實(shí)現(xiàn)掃碼登錄,這種方式太香了??!

          2、SpringSecurity + JWT 實(shí)現(xiàn)單點(diǎn)登錄

          3、基于 Vue+Spring 前后端分離管理系統(tǒng)ELAdmin

          4、Spring Boot 接入支付寶完整流程實(shí)戰(zhàn)

          5、Spring Boot 實(shí)現(xiàn)多圖片上傳并回顯,漲姿勢(shì)了~



          最近面試BAT,整理一份面試資料Java面試BAT通關(guān)手冊(cè),覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫(kù)、數(shù)據(jù)結(jié)構(gòu)等等。
          獲取方式:關(guān)注公眾號(hào)并回復(fù) java 領(lǐng)取,更多內(nèi)容陸續(xù)奉上。
          明天見(jiàn)(??ω??)??
          瀏覽 30
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久18禁 | 日韩高清无码电影 | 特级茜茜人体444WWW | 久久精品国产99国产精品导航 | www.狼友 |