国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

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

2019-11-26 13:49:24
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

一般認(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í)變量,接下來(lái)對(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里面的語(yǔ)句)。

第二個(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

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

結(jié)論:

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

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 岐山县| 叶城县| 崇左市| 广宗县| 东台市| 昔阳县| 杭州市| 杨浦区| 通城县| 会昌县| 西乌| 黎平县| 封丘县| 山阳县| 当涂县| 黄平县| 宝兴县| 辉南县| 常山县| 阿拉尔市| 赤城县| 洛隆县| 陵水| 防城港市| 宜春市| 弥渡县| 衡山县| 河西区| 罗甸县| 正蓝旗| 池州市| 青铜峡市| 仁怀市| 太湖县| 石首市| 永善县| 莱芜市| 神农架林区| 张家川| 泸州市| 绥阳县|