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();
          }
          }

          結果是0,為什么呢 ?

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

          i=0;//假設此時內存地址為0x12345678
          i=i++;//系統新開內存地址0x99999999,存放i原始值0,然后0x12345678的存放數據+1操作
                //此時0x12345678=1,0x99999999=0,但是上一步是先給值,所以i的內存地址是0x99999999=0;

          所以i=0,

          但是,如果是
          i=0;
          i++;
          此時i=1,因為0x99999999處新開辟的內存地址沒有給任何引用,所以被丟棄了!i繼續使用0x12345678處值

          你在棧上沒有計算,正確的過程是

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


          posted on 2008-05-14 16:35 henry1451 閱讀(159) 評論(0)  編輯  收藏 所屬分類: Java技術
          主站蜘蛛池模板: 齐齐哈尔市| 东安县| 青浦区| 全南县| 二手房| 金湖县| 平罗县| 合肥市| 黑龙江省| 城口县| 崇阳县| 济源市| 绥芬河市| 廊坊市| 浪卡子县| 仁怀市| 修武县| 浦城县| 渑池县| 女性| 叙永县| 高州市| 米易县| 金平| 儋州市| 响水县| 隆德县| 红安县| 萨嘎县| 尚义县| 南昌市| 老河口市| 和田县| 井陉县| 巴彦县| 平定县| 晋中市| 辽源市| 行唐县| 敦煌市| 哈密市|