posts - 60,comments - 71,trackbacks - 0

          public class test
          {
          int i = 0;

          public test()
          {
                    i=i ++; 
                   System.out.println(i);
          }

          public static void main(String argsp[]) {
          new test();
          }
          }

          結(jié)果是0,為什么呢 ?

          java的編譯器搞的鬼!在遇到++和--操作符的時(shí)候會(huì)重新為原變量分配一塊內(nèi)存空間,以存放原始的值,而在完成了賦值運(yùn)算之后,就將這塊內(nèi)存釋放掉。由于i的原始值存放在后開(kāi)辟的內(nèi)存中,這樣i=i++后,由于是先賦值,i就會(huì)得到i的原始值(存放在新內(nèi)存中的數(shù)椐),而原來(lái)內(nèi)存位置的i自加后只保留在原來(lái)的位置,由于此時(shí)i指向已經(jīng)是新開(kāi)辟出來(lái)的內(nèi)存地址,所以i的值沒(méi)有發(fā)送變化!
          換句話說(shuō),
          while(true){
             i=i++;
          }
          永遠(yuǎn)執(zhí)行i的值恒等于i的初始值,即使不是0也一樣!下面我把過(guò)程寫(xiě)一下

          i=0;//假設(shè)此時(shí)內(nèi)存地址為0x12345678
          i=i++;//系統(tǒng)新開(kāi)內(nèi)存地址0x99999999,存放i原始值0,然后0x12345678的存放數(shù)據(jù)+1操作
                //此時(shí)0x12345678=1,0x99999999=0,但是上一步是先給值,所以i的內(nèi)存地址是0x99999999=0;

          所以i=0,

          但是,如果是
          i=0;
          i++;
          此時(shí)i=1,因?yàn)?x99999999處新開(kāi)辟的內(nèi)存地址沒(méi)有給任何引用,所以被丟棄了!i繼續(xù)使用0x12345678處值

          你在棧上沒(méi)有計(jì)算,正確的過(guò)程是

          你把i的值0放到棧上
          然后把i變成1,但是棧上還是0
          最后把棧上的0彈出來(lái)賦值給i,結(jié)果把剛才iinc的結(jié)果給沖掉了,i又變成了0


          posted on 2008-05-14 16:35 henry1451 閱讀(153) 評(píng)論(0)  編輯  收藏 所屬分類: Java技術(shù)
          主站蜘蛛池模板: 花莲市| 泸定县| 巨野县| 二连浩特市| 河津市| 巴林左旗| 建平县| 木兰县| 阿荣旗| 五寨县| 什邡市| 安徽省| 南投县| 盐亭县| 新民市| 乐业县| 呼图壁县| 武宣县| 延边| 东明县| 石屏县| 阿巴嘎旗| 林州市| 巴中市| 府谷县| 武安市| 本溪市| 锡林浩特市| 孟津县| 厦门市| 湖口县| 漳平市| 龙南县| 方正县| 泊头市| 弥勒县| 枣阳市| 辽阳县| 丹棱县| 丰顺县| 营口市|