應(yīng)用,一定要應(yīng)用

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            25 Posts :: 0 Stories :: 118 Comments :: 0 Trackbacks

          2004-10-24

          i=0;i=i++為什么等于0這個(gè)問題困擾了我好長(zhǎng)的一段時(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-08-24 17:05 flyffa 閱讀(977) 評(píng)論(0)  編輯  收藏 所屬分類: 讀書
          主站蜘蛛池模板: 离岛区| 晋州市| 汝南县| 嘉兴市| 项城市| 海兴县| 竹溪县| 拉萨市| 嵊州市| 石泉县| 乌苏市| 磐石市| 呈贡县| 于田县| 龙胜| 贵定县| 乌苏市| 陈巴尔虎旗| 北川| 宜州市| 安乡县| 宝丰县| 历史| 彰化县| 雷波县| 竹山县| 阿拉善左旗| 扎兰屯市| 玉龙| 独山县| 石林| 顺昌县| 河池市| 山阴县| 贺州市| 蒙自县| 黔西| 碌曲县| 海原县| 凉城县| 获嘉县|