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

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

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

    DANCE WITH JAVA

    開發出高質量的系統

    常用鏈接

    統計

    積分與排名

    好友之家

    最新評論

    利用字節碼解決java中遇到的問題(轉載)

    很對不起作者,當時看到這篇文章的時候因為有事情忙,所以直接拷貝發到郵箱,這個時候轉出來,就找不到出處了,如果哪位找到出處給我留個言,我把出處補上。謝謝

    i=0;i=i++為什么等于0這個問題困擾了我好長的一段時間,結果前段時間還試圖從虛擬機那個層面進行解釋,但無論是線程還是方法調用都不能解釋其現象,發現方向性錯誤,這只是一個語言的特性而已。在java lang spec中提到:
    1、java運算符的優先級++符是大于=的。
    2、The result of the postfix increment expression is not a variable, but a value.后++符表達式的結果是個值而不是一個變量。

    也就是說后++符先將自己的值存儲起來,然后對變量進行++;
    再進行賦值操作,也就是將先存儲起來的值賦給變量i,這樣的操作就導致了i值被置為0了


    對于C和C++來說不一樣,在講到m=i++操作時,C語言是先將i的值賦給了m,然后將i值++,這樣i=i++的結果自然就是1了,c的實現中是不存在那個中間的值的存儲的。


    由于java和c不同的語言特性,導致了i=i++的不同之處,前面的筆記中已經提到,由于java lang spec中的一些細微規定,導致其運行結果的不同,我們可以用個例子來看i=i++在jvm中實際的運行過程。
    源程序test.java:
    public class test {
    ? public test() {
    ? }
    ? public static void main(String[] args) {
    ??? int i=0;
    ??? i=i++;
    ? }

    }
    我們用javap來看其實際的虛擬機指令集:
    C:\JBuilderX\jdk1.4\bin>javap -c? -classpath "d:/" test
    Compiled from "test.java"
    public class test extends java.lang.Object{
    public test();
    ? Code:
    ?? 0:?? aload_0
    ?? 1:?? invokespecial?? #1; //Method java/lang/Object."":()V
    ?? 4:?? nop
    ?? 5:?? return

    public static void main(java.lang.String[]);
    ? Code:
    ?? 0:?? iconst_0?//常數0入棧
    ?? 1:?? istore_1?//i賦值,常數值出棧
    ?//至此完成i=0;
    ?? 2:?? iload_1??//裝載變量i,0入棧
    ?//第2步是特殊的一步,這步將i值先行保存,以備賦值使用
    ?? 3:?? iinc??? 1, 1?//變量值增加,棧內值不變
    ?//至此完成i++
    ?? 6:?? istore_1?//i賦值,0出棧。
    ?//至此完成i=i++
    ?? 7:?? nop??//donothing
    ?? 8:?? return

    }

    對比而言,對于i++而言,i=i++指令多了兩步,2和6
    其實這兩步是賦值符號引起的,有意思的是第二步出現的時機,是在iinc之前,這就是因為java lang spec中規定的。


    posted on 2006-11-04 15:36 dreamstone 閱讀(6164) 評論(4)  編輯  收藏 所屬分類: jdk相關

    評論

    # re: 利用字節碼解決java中遇到的問題(轉載) 2007-08-01 11:56 小頭獵豹

    C和Java應該一樣的結果吧
      回復  更多評論   

    # re: 利用字節碼解決java中遇到的問題(轉載) 2007-08-01 12:18 dreamstone

    @小頭獵豹
    可以自己寫個嘗試一下,這個我當時在linux gcc試的。  回復  更多評論   

    # re: 利用字節碼解決java中遇到的問題(轉載)[未登錄] 2007-12-04 09:44 john

    按照你說的方法,在一方面可以行得通.
    但是i++是先用i的值,然后再自加.按照這個規則,應該是先賦值再自加.與你的先自加,再賦值相反啊.  回復  更多評論   

    # re: 利用字節碼解決java中遇到的問題(轉載)[未登錄] 2007-12-04 10:07 dreamstone

    @john
    你沒仔細看文章啊。
    按照我們對java語法的理解i=i++會先執行 i=i(這時候i=0),然后是i++ (這時候i=1)這樣的結果應該是1,但是你自己實際寫個程序看看結果,是0.為什么會這樣?

    這要歸結于java語言的實現上,具體文中已經解釋的很詳細了。看字節碼就明白了。注意字節碼語法不等于java語法。

    先賦值后加加是java語法的規定。
    先加加后復制時java語言實現的方式。具體為什么這么實現,要去問sun了。

      回復  更多評論   

    主站蜘蛛池模板: 久久WWW免费人成—看片| 成人国产mv免费视频| 黄色毛片免费观看| 亚洲人成影院在线高清| 亚洲精品乱码久久久久久中文字幕| 妞干网在线免费视频| 18禁美女黄网站色大片免费观看| 曰韩无码AV片免费播放不卡| 亚洲gay片在线gv网站| 亚洲伊人久久大香线焦| 久久久久亚洲av无码专区喷水 | 亚洲欧洲日产韩国在线| 最新国产AV无码专区亚洲| 91麻豆最新在线人成免费观看| 三上悠亚在线观看免费| 日本黄页网址在线看免费不卡| 亚洲人成欧美中文字幕| 久久免费美女视频| 人人爽人人爽人人片av免费 | 日韩电影免费在线观看视频| 在线看片v免费观看视频777| 午夜爽爽爽男女免费观看影院| a毛片免费观看完整| 一个人看www免费高清字幕| 免费无码午夜福利片| 国产亚洲综合一区二区三区| 亚洲精品精华液一区二区| 亚洲人成网站色7799| 亚洲一区在线免费观看| 亚洲伊人久久大香线焦| 456亚洲人成影院在线观| 亚洲人成网站看在线播放| 亚洲人成黄网在线观看| 中文字幕亚洲情99在线| 亚洲中文字幕久久无码| 亚洲日韩精品国产一区二区三区 | 天天天欲色欲色WWW免费| 四虎免费在线观看| 国产女高清在线看免费观看| 亚洲国产a级视频| 亚洲一区二区三区在线观看精品中文 |