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 小良良 閱讀(1711) 評論(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

          統計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 三亚市| 丽江市| 米脂县| 灌阳县| 咸丰县| 沙洋县| 宜黄县| 九江县| 云阳县| 漾濞| 海南省| 环江| 万全县| 上犹县| 凉城县| 河北区| 麻江县| 昌都县| 茌平县| 金华市| 曲沃县| 左贡县| 诸城市| 太白县| 安义县| 手机| 瓮安县| 清河县| 建瓯市| 玛多县| 彭泽县| 丹巴县| 尼勒克县| 张家界市| 玛纳斯县| 大连市| 远安县| 钟祥市| 吉首市| 十堰市| 建阳市|