<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java JavaScript Web2.0

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

    Java中的++操作

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





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






        有這樣一段代碼
    1     int a=1;
    2     a=(4+(a++));
    3     System.out.println(a);
        輸出結(jié)果為5,而不是2或者6。自增操作在賦值操作之前,而不是之后。
        同理,語句a=a++;執(zhí)行完成之后,a的值不會(huì)發(fā)生變化,而不是原來想像的自增1。
        下面解釋運(yùn)行機(jī)制:
       
        這段代碼對(duì)應(yīng)的Java字節(jié)碼為:
    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(bǔ)的值載入(存入一個(gè)臨時(shí)地方);
        5行,通過一個(gè)指令iinc,實(shí)現(xiàn)a的自增1,并把新的結(jié)果存入原地點(diǎn);
        6行,完成加法,關(guān)鍵在于,此處使用的a的值是第4行l(wèi)oad進(jìn)來時(shí)的值,而不是第5行完成自增操作后的值;
        7行,把存入結(jié)果a
        所以,自增操作發(fā)生在istore操作之前,所以最終a的值為5;

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




    評(píng)論

    # re: Java中的++操作  回復(fù)  更多評(píng)論   

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

    # re: Java中的++操作  回復(fù)  更多評(píng)論   

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

    # re: Java中的++操作  回復(fù)  更多評(píng)論   

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

    # re: Java中的++操作  回復(fù)  更多評(píng)論   

    2007-09-20 17:49 by Jack L
    是的,現(xiàn)實(shí)中應(yīng)該幾乎沒有這種寫法,純興趣研究:)

    # re: Java中的++操作  回復(fù)  更多評(píng)論   

    2007-09-20 17:52 by Unmi
    如果要看i=(4+(i++));在C++中執(zhí)行就反匯編出來看看
    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中的++操作  回復(fù)  更多評(píng)論   

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

    # re: Java中的++操作  回復(fù)  更多評(píng)論   

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

    # re: Java中的++操作  回復(fù)  更多評(píng)論   

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

    # re: Java中的++操作  回復(fù)  更多評(píng)論   

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

    # re: Java中的++操作  回復(fù)  更多評(píng)論   

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

    # re: Java中的++操作  回復(fù)  更多評(píng)論   

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

    # re: Java中的++操作  回復(fù)  更多評(píng)論   

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

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

    # re: Java中的++操作  回復(fù)  更多評(píng)論   

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

    # re: Java中的++操作  回復(fù)  更多評(píng)論   

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

    是的。我猜錯(cuò)了,呵呵

    # re: Java中的++操作  回復(fù)  更多評(píng)論   

    2007-09-21 00:59 by dc
    奇怪,難道連括號(hào)也保證不了運(yùn)算的優(yōu)先級(jí)?

    # re: Java中的++操作  回復(fù)  更多評(píng)論   

    2007-09-21 01:17 by piaoyi
    a++和++a是不同的,在java中本來就有分,一個(gè)是先把值return出去再自加,一個(gè)是自加後才return,因?yàn)槟愕膶懛ㄊ莂++,所以先return的值是1,再和4相加就是5且又指給a,這樣後來的a自加就沒有用了

    # re: Java中的++操作  回復(fù)  更多評(píng)論   

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

    # re: Java中的++操作  回復(fù)  更多評(píng)論   

    2007-09-21 09:32 by Jack L
    是的,Java和JavaScript是這樣的,但是你看前面的評(píng)論,C語言中,a++在整個(gè)語句(用分號(hào)結(jié)束的語句)結(jié)束之后才執(zhí)行。這是關(guān)鍵。@piaoyi

    # re: Java中的++操作  回復(fù)  更多評(píng)論   

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

    # re: Java中的++操作  回復(fù)  更多評(píng)論   

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

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲免费视频网址| 四虎成人免费观看在线网址 | 插鸡网站在线播放免费观看| 国产精品亚洲一区二区三区在线 | 青苹果乐园免费高清在线| 美女黄网站人色视频免费| 亚洲国产成人精品无码区在线观看 | 91久久精品国产免费一区| 久久亚洲精品成人无码| 亚洲av综合色区| 国产成人免费一区二区三区| 成全高清在线观看免费| 亚洲精品国产精品| 久久亚洲春色中文字幕久久久| 国产免费卡一卡三卡乱码| 91精品国产免费久久国语麻豆| 老子影院午夜伦不卡亚洲| 亚洲综合视频在线| 亚洲精品偷拍视频免费观看 | a级毛片毛片免费观看久潮喷| 在线综合亚洲欧洲综合网站| 亚洲精品乱码久久久久久不卡| 99久久99这里只有免费费精品 | 中文字幕在线观看亚洲日韩| 国产成人亚洲综合无码精品| 免费观看亚洲人成网站| 99久在线国内在线播放免费观看| 黄色大片免费网站| 亚洲а∨天堂久久精品9966| 亚洲福利在线观看| 亚洲性久久久影院| 国产精品无码素人福利免费| 免费A级毛片无码A∨免费| 韩国免费A级毛片久久| 日韩色日韩视频亚洲网站| 97久久国产亚洲精品超碰热| 亚洲国产精品免费视频| 亚洲国产综合无码一区| 亚洲高清视频一视频二视频三| 天天干在线免费视频| 69天堂人成无码麻豆免费视频|