自增(++)和自減(--)運算符


     自增(++):將變量的值加1,分前綴式(如++i)和后綴式(如i++)。前綴式是先加1再使用;后綴式是先使用再加1。
     自減(--):將變量的值減1,分前綴式(如--i)和后綴式(如i--)。前綴式是先減1再使用;后綴式是先使用再減1。

     我們先從問題入手:

int i = 0; int j = i++; int k = --i;
代碼運行后,i等於多少?j等於多少?k等於多少? 
 結果:

分析結果:int j=i++;是后綴式,因此i的值先被賦予j,然后再自增1,所以這行代碼運行后,i=1、j=0;而int k=--i;是前綴式,因此i先自減1,然后再將它的值賦予k,因此這行代碼運行后,i=0、k=0。 

int i = 0; int j = i++ + ++i; //相當於0 + 2 int k = --i + i--;    //相當於1 + 1

代碼運行后,i等於多少?j等於多少?k等於多少? 

結果:

 分析結果:對於int j=i++ + ++i;,首先運行i++,i的值0被用於加運算(+),之后i自增值變為1,然后運行++i,i先自增變為2,之后被用於加運算,最后將i兩次的值相加的結果0+2=2賦給j,因此這行代碼運行完畢后i=2、j=2;對於int k=--i + i--;用一樣的思路分析,具體過程在此不再贅述,結果應該是i=0、k=2。

       

        為什么會有這樣的結果呢?我們來看看++i和i++的字節碼有什么不一樣

        代碼如下:

public class MyDemo { public static void main(String[] args) { beforeAdd(1); afterAdd(1); } public static void beforeAdd(int arg){ int before = ++arg; } public static void afterAdd(int arg){ int after =  arg++; } }

 

         查看字節碼指令:javap -v   路徑\MyDemo.class,得到如下字節碼指令

 

      

             從上圖分析:++i是先把自增再壓棧,而i++是先壓棧再自增,很明顯解釋上面例子的結果

 

             思考一個問題fori循環i++和++i的效率有差別嗎?

             把上面的代碼稍微修改:

public class MyDemo { public static void main(String[] args) { beforeAdd(1); afterAdd(1); } public static void beforeAdd(int arg){ for (int i = 0; i < arg; ++i) { } } public static void afterAdd(int arg){ for (int i = 0; i < arg; i++) { } } }

      同樣查看字節碼指令:

      

      

      它們的字節碼指令一樣,所以它們的執行效率也一樣。    

 

     自增與自減運算符其實還遵循以下規律:
     1. 可以用於整數類型byte、short、int、long,浮點類型float、double,以及字符串類型char。
     2. 在Java5.0及以上版本中,它們可以用於基本類型對應的包裝器類Byte、Short、Integer、Long、Float、Double、Character。
     3. 它們的運算結果的類型與被運算的變量的類型相同。
 
    參考:《JAVA解惑系列》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM