Java之路

          深入理解i++和++i

           1 int i=0;
           2 int j=i++;//i=1;j=0;
           3 
           4 int i=0;
           5 int j=++i;//i=1;j=1;
           6 
           7 int i=0;
           8 i=i++;//i=0;
           9 
          10 int i=0;
          11 i=++i;//i=1;



          i++:
          iconst_0
          istore_1
          iload_1
          iinc 1,1
          istore_1

          ++i:
          iconst_0
          istore_1
          iinc 1,1
          iload_1
          istore_1





          總結:
          i=i++沒有意義,不要在代碼里出現為好,以免誤導他人。也不建議用i=++i。

          posted on 2009-07-25 18:57 小良良 閱讀(1709) 評論(7)  編輯  收藏

          評論

          # re: 深入理解i++和++i 2009-07-25 21:11 ahx

          int i=0;
          i=i++;//i=0;

          結果為1 是么?
          編譯器:
          gcc version 4.3.3
          代碼:
          #include <stdio.h>

          int main(int argc , char** argv){
          int i = 0;
          i = i ++;
          fprintf(stdout,"%d",i);
          }
          運行結果:
          1
            回復  更多評論   

          # re: 深入理解i++和++i 2009-07-25 21:21 ahx

          抱歉,沒有注意“Java之路”
          編譯器:javac 1.6.0_14
          代碼:
          class Tt{
          public static void main(String[] args){
          int i = 0;
          i = i++;
          System.out.println(i);
          }
          }
          結果:0  回復  更多評論   

          # re: 深入理解i++和++i 2009-07-25 21:43 小良良

          @ahx
          多才!  回復  更多評論   

          # re: 深入理解i++和++i 2009-07-25 23:50 Jacky-Q

          常識吧。講運算符時都會提到這一點。  回復  更多評論   

          # re: 深入理解i++和++i 2009-07-26 06:51 feenn

          @ahx
          正確。先執行賦值操作,然后執行增量操作。  回復  更多評論   

          # re: 深入理解i++和++i 2009-07-26 15:16 木糖醇

          @ahx

          很希望在給多種代碼演示的時候說明下是哪種語言..
          我們新手看起來就沒那么懵了...
          也可以長長知識...謝謝!  回復  更多評論   

          # re: 深入理解i++和++i[未登錄] 2009-07-26 22:12 lanxiazhi

          我來具體說明:
          int i=0;
          i=i++;
          上述兩行java代碼bytecode如下:
          iconst_0 //把常量0放到堆棧
          istore_1 //把堆棧上的數(上面那個0)放到存儲位置1,也就是i的存儲位置,所以i的值就是0了
          iload_1 //加載位置1上的整數值到棧頂,就是i,因此棧頂的值是0
          iinc 1,1 //把位置1的數,也就是i,自增1,因此i變成了1(注意:iinc指令不會操作堆棧)
          istore_1 //把棧頂的那個數,也就是0,存到位置1,因此i的值是0.

          int i=0;
          i=++i;
          -->
          iconst_0 //把常量0放到棧頂
          istore_1 //把堆棧上的數(上面那個0)放到存儲位置1,也就是i的存儲位置,所以i的值就是0了,棧頂值不變
          iinc 1,1 //把位置1的數,也就是i,自增1,因此i變成了1(注意:iinc指令不會操作堆棧)
          iload_1 //加載位置1的數,也就是i的值,1,到棧頂
          istore_1//把棧頂的值存到位置1,因此i的值就是1了。

          了解字節碼的操作:
          http://blog.csdn.net/BU_BetterYou/archive/2008/06/16/2553108.aspx
            回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          <2009年7月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          統計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 府谷县| 卢氏县| 崇明县| 巧家县| 内江市| 东宁县| 平塘县| 拉萨市| 九江市| 高台县| 金寨县| 光山县| 来凤县| 澄城县| 治多县| 容城县| 庆云县| 岱山县| 元氏县| 图木舒克市| 鞍山市| 秦皇岛市| 阿勒泰市| 灵川县| 永嘉县| 乡城县| 鹿邑县| 军事| 乐清市| 永丰县| 和硕县| 澳门| 华亭县| 海原县| 来安县| 韩城市| 定兴县| 霞浦县| 林周县| 苗栗县| 枣强县|