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

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

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

    DANCE WITH JAVA

    開發(fā)出高質(zhì)量的系統(tǒng)

    常用鏈接

    統(tǒng)計(jì)

    積分與排名

    好友之家

    最新評(píng)論

    利用字節(jié)碼解決java中遇到的問題(轉(zhuǎn)載)

    很對(duì)不起作者,當(dāng)時(shí)看到這篇文章的時(shí)候因?yàn)橛惺虑槊?,所以直接拷貝發(fā)到郵箱,這個(gè)時(shí)候轉(zhuǎn)出來,就找不到出處了,如果哪位找到出處給我留個(gè)言,我把出處補(bǔ)上。謝謝

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

    也就是說后++符先將自己的值存儲(chǔ)起來,然后對(duì)變量進(jìn)行++;
    再進(jìn)行賦值操作,也就是將先存儲(chǔ)起來的值賦給變量i,這樣的操作就導(dǎo)致了i值被置為0了


    對(duì)于C和C++來說不一樣,在講到m=i++操作時(shí),C語言是先將i的值賦給了m,然后將i值++,這樣i=i++的結(jié)果自然就是1了,c的實(shí)現(xiàn)中是不存在那個(gè)中間的值的存儲(chǔ)的。


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

    }
    我們用javap來看其實(shí)際的虛擬機(jī)指令集:
    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?//常數(shù)0入棧
    ?? 1:?? istore_1?//i賦值,常數(shù)值出棧
    ?//至此完成i=0;
    ?? 2:?? iload_1??//裝載變量i,0入棧
    ?//第2步是特殊的一步,這步將i值先行保存,以備賦值使用
    ?? 3:?? iinc??? 1, 1?//變量值增加,棧內(nèi)值不變
    ?//至此完成i++
    ?? 6:?? istore_1?//i賦值,0出棧。
    ?//至此完成i=i++
    ?? 7:?? nop??//donothing
    ?? 8:?? return

    }

    對(duì)比而言,對(duì)于i++而言,i=i++指令多了兩步,2和6
    其實(shí)這兩步是賦值符號(hào)引起的,有意思的是第二步出現(xiàn)的時(shí)機(jī),是在iinc之前,這就是因?yàn)閖ava lang spec中規(guī)定的。


    posted on 2006-11-04 15:36 dreamstone 閱讀(6175) 評(píng)論(4)  編輯  收藏 所屬分類: jdk相關(guān)

    評(píng)論

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

    C和Java應(yīng)該一樣的結(jié)果吧
      回復(fù)  更多評(píng)論   

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

    @小頭獵豹
    可以自己寫個(gè)嘗試一下,這個(gè)我當(dāng)時(shí)在linux gcc試的。  回復(fù)  更多評(píng)論   

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

    按照你說的方法,在一方面可以行得通.
    但是i++是先用i的值,然后再自加.按照這個(gè)規(guī)則,應(yīng)該是先賦值再自加.與你的先自加,再賦值相反啊.  回復(fù)  更多評(píng)論   

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

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

    這要?dú)w結(jié)于java語言的實(shí)現(xiàn)上,具體文中已經(jīng)解釋的很詳細(xì)了??醋止?jié)碼就明白了。注意字節(jié)碼語法不等于java語法。

    先賦值后加加是java語法的規(guī)定。
    先加加后復(fù)制時(shí)java語言實(shí)現(xiàn)的方式。具體為什么這么實(shí)現(xiàn),要去問sun了。

      回復(fù)  更多評(píng)論   

    主站蜘蛛池模板: 亚洲视频人成在线播放| 国产精品亚洲精品观看不卡| 亚洲AV一二三区成人影片| 美女黄频a美女大全免费皮| 免费无码毛片一区二区APP| 亚洲国产另类久久久精品| 粉色视频成年免费人15次| 亚洲色欲www综合网| 无码人妻久久一区二区三区免费丨 | 日本免费网站观看| 美女18毛片免费视频| 亚洲人成网站观看在线播放| 中文无码日韩欧免费视频| 在线亚洲97se亚洲综合在线| 免费可以在线看A∨网站| 一级女性全黄生活片免费看| 永久免费av无码网站韩国毛片| 亚洲狠狠婷婷综合久久蜜芽| 久久91亚洲人成电影网站| 免费精品一区二区三区在线观看| 99视频在线观看免费| 香蕉视频亚洲一级| 亚洲精品自在线拍| 亚洲va中文字幕无码久久不卡| 日韩精品免费电影| 无码区日韩特区永久免费系列| 九九热久久免费视频| 亚洲一区二区三区在线观看蜜桃 | 亚洲精品精华液一区二区| 免费在线看片网站| 久久久久久AV无码免费网站 | 精品亚洲视频在线| 久久91亚洲精品中文字幕| 岛国av无码免费无禁网站| fc2成年免费共享视频网站| 亚洲国产精品人久久电影| 可以免费观看一级毛片黄a| 99ee6热久久免费精品6| 黄页网站在线视频免费| 亚洲另类图片另类电影| 国产亚洲精久久久久久无码AV|