Java JavaScript Web2.0

          WWW World, Jack's World
          posts - 9, comments - 28, trackbacks - 0, articles - 0
            BlogJava :: 首頁 ::  :: 聯系 :: 聚合  :: 管理

          Java中的++操作

          Posted on 2007-09-20 16:50 Jack L 閱讀(1555) 評論(20)  編輯  收藏 所屬分類: Java





              本文正文及所有討論的整理稿發布于:http://webdn.trueself.cn/archives/7






              有這樣一段代碼
          1     int a=1;
          2     a=(4+(a++));
          3     System.out.println(a);
              輸出結果為5,而不是2或者6。自增操作在賦值操作之前,而不是之后。
              同理,語句a=a++;執行完成之后,a的值不會發生變化,而不是原來想像的自增1。
              下面解釋運行機制:
             
              這段代碼對應的Java字節碼為:
          1     iconst_1
          2     istore_1
          3     iconst_4
          4     iload_1
          5     iinc    #1      #1
          6     iadd
          7     istore_1
              解釋:
              1~3行是聲明變量a并賦值,并聲明常量4
              4行,把a的值載入(存入一個臨時地方);
              5行,通過一個指令iinc,實現a的自增1,并把新的結果存入原地點;
              6行,完成加法,關鍵在于,此處使用的a的值是第4行load進來時的值,而不是第5行完成自增操作后的值;
              7行,把存入結果a
              所以,自增操作發生在istore操作之前,所以最終a的值為5;

              為了更好的理解,下面給出另外一段代碼:
           1     int i=1;
           2     i=(4+(++i));
           3     ios.println(i);
           4     //這段程序的執行結果顯然為6
           5     //字節碼為
           6     iconst_1
           7     istore_1
           8     iconst_4
           9     iinc    #1      #1
          10    iload_1
          11    iadd
          12    istore_1




          評論

          # re: Java中的++操作  回復  更多評論   

          2007-09-20 17:20 by 千里冰封
          還研究的挺仔細的嘛,呵呵,竟然看字節碼了

          # re: Java中的++操作  回復  更多評論   

          2007-09-20 17:39 by Jack L
          千里兄過獎了
          順便補充一下,剛才我研究了JavaScript和C語言中的類似情況,發現JavaScript的結果與剛才講的Java代碼結果相同,但是C語言代碼有明顯不同的結果;
          比如這段代碼:
          int i=1;
          int t=(4+(i++));
          執行完成之后,t的值為5,i的值為2;這個結果一點也不出乎意料
          但是稍加改寫
          int i=1;
          i=(4+(i++));
          執行完成之后,i的值變成了6;如果這段交給Java虛擬機運行,如上面所示,結果是5;
          所以,我的想法是,C語言中的++(位于操作數右邊)在整條用分號結束的語句結束之后運行;相當于在該語句之后單獨寫一條i++語句。

          # re: Java中的++操作  回復  更多評論   

          2007-09-20 17:46 by Unmi
          i=(4+(i++)); 這種寫法會讓人不知所然,既然i++了,又賦給i

          # re: Java中的++操作  回復  更多評論   

          2007-09-20 17:49 by Jack L
          是的,現實中應該幾乎沒有這種寫法,純興趣研究:)

          # re: Java中的++操作  回復  更多評論   

          2007-09-20 17:52 by Unmi
          如果要看i=(4+(i++));在C++中執行就反匯編出來看看
          7: int i=1;
          00401798 mov dword ptr [ebp-4],1
          8: i=(4+(i++));
          0040179F mov eax,dword ptr [ebp-4]
          004017A2 add eax,4
          004017A5 mov dword ptr [ebp-4],eax
          004017A8 mov ecx,dword ptr [ebp-4]
          004017AB add ecx,1
          004017AE mov dword ptr [ebp-4],ecx

          # re: Java中的++操作  回復  更多評論   

          2007-09-20 17:52 by Jack L
          再進一步,考慮:
          i=1;
          i=(4+(i++)+(i++));
          C語言的運行結果為8,Java和JavaScript的結果為7.
          印證了我剛才對于C語言機制的想法,即++操作在整條語句之后執行;相加的值為(4+1+1)
          在Java和JavaScript中,第二次load i的值時,++操作已經被執行過一次了,所以相加的值為(4+1+2)

          # re: Java中的++操作  回復  更多評論   

          2007-09-20 17:57 by Jack L
          謝謝Unmi,看來在C語言中,++確實在最后執行,這與Java和JavaScript非常不一樣。后者的++在表達式走出作用域的時候就執行,而不會等到整個語句結束。

          # re: Java中的++操作  回復  更多評論   

          2007-09-20 18:02 by teasp
          二樓的實驗也非常有意義。沒想到c和java在這一點上還有區別,呵呵,學到了。不過有一點不太同意二樓說的,我覺得在c里面應該是 i=i++;和i=(i++);的區別,前者不會加1,后者會,而java中這兩者是一樣的。我說的僅僅是猜測,并沒有實驗過,說錯了見諒

          # re: Java中的++操作  回復  更多評論   

          2007-09-20 18:03 by teasp
          暈,沒想到這么多人評論了。。。

          # re: Java中的++操作  回復  更多評論   

          2007-09-20 18:21 by 千里冰封
          大家都挺能研究的

          # re: Java中的++操作  回復  更多評論   

          2007-09-20 18:48 by Jack L
          teasp 說的二樓是我嗎? 偶是樓主的說:)
          我剛看了
          執行下面兩句
          1: i=i++;
          2: i=(i++);
          在C中,執行完成之后,i的值均為2
          在Java和JavaScript中,均為1

          # re: Java中的++操作  回復  更多評論   

          2007-09-20 19:09 by Unmi
          總結一下,這樣寫
          i=(4+(++i));
          完全是給自己制造麻煩,代碼不規范

          極端一些,如果你碰到面試問你
          int a=1;
          int b=1;
          int c= a++*b+++a++b;
          你會去做這種題嗎?
          我會轉身走人

          # re: Java中的++操作  回復  更多評論   

          2007-09-20 20:55 by Jack L
          好玩就行,自己肯定不會這樣編碼的:)

          # re: Java中的++操作  回復  更多評論   

          2007-09-20 21:40 by teasp
          @Jack L

          是的。我猜錯了,呵呵

          # re: Java中的++操作  回復  更多評論   

          2007-09-21 00:59 by dc
          奇怪,難道連括號也保證不了運算的優先級?

          # re: Java中的++操作  回復  更多評論   

          2007-09-21 01:17 by piaoyi
          a++和++a是不同的,在java中本來就有分,一個是先把值return出去再自加,一個是自加後才return,因為你的寫法是a++,所以先return的值是1,再和4相加就是5且又指給a,這樣後來的a自加就沒有用了

          # re: Java中的++操作  回復  更多評論   

          2007-09-21 09:31 by Jack L
          是符合語義的。++操作的優先級本來就大于加號,所以一直不用寫括號,寫括號只是為了可讀性@dc

          # re: Java中的++操作  回復  更多評論   

          2007-09-21 09:32 by Jack L
          是的,Java和JavaScript是這樣的,但是你看前面的評論,C語言中,a++在整個語句(用分號結束的語句)結束之后才執行。這是關鍵。@piaoyi

          # re: Java中的++操作  回復  更多評論   

          2007-09-21 10:17 by 千里冰封
          呵呵,看似簡單的操作,實際并不簡單:)

          # re: Java中的++操作  回復  更多評論   

          2007-09-21 10:48 by 全憑一顆心
          研究的挺多,激發了我的研究熱情,XX(謝謝)樓上各位!

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


          網站導航:
           
          主站蜘蛛池模板: 铁岭县| 福贡县| 嘉定区| 青田县| 轮台县| 呼和浩特市| 浪卡子县| 昌平区| 哈密市| 北川| 白水县| 达尔| 百色市| 临高县| 沂南县| 海林市| 晋中市| 西充县| 西宁市| 沙河市| 法库县| 墨脱县| 南城县| 辽源市| 安西县| 孙吴县| 南丹县| 卢龙县| 松潘县| 抚远县| 广水市| 景泰县| 准格尔旗| 竹山县| 桃园市| 西乌珠穆沁旗| 新龙县| 玉门市| 丹棱县| 墨玉县| 贞丰县|