隨筆-144  評論-80  文章-1  trackbacks-0
           

             package com.faintbear;

          public class test
          {
          int i = 0;

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

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

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

          回復(fù)人: blackhost(劍心) ( 四級(中級)) 信譽:98 2005-3-27 16:42:06 得分: 0
           

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

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

          所以i=0,

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


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

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

          posted on 2005-03-28 13:59 小力力力 閱讀(290) 評論(0)  編輯  收藏 所屬分類: JAVA
          主站蜘蛛池模板: 曲麻莱县| 安宁市| 电白县| 长白| 通河县| 霍州市| 剑河县| 鞍山市| 那曲县| 丹凤县| 赣州市| 碌曲县| 菏泽市| 和平县| 衡阳县| 台山市| 江油市| 沈丘县| 西华县| 金溪县| 绩溪县| 平顺县| 祁门县| 河间市| 台中市| 克拉玛依市| 高陵县| 内江市| 东明县| 临夏县| 始兴县| 密云县| 永德县| 锡林郭勒盟| 广德县| 丹棱县| 华池县| 怀仁县| 牡丹江市| 若尔盖县| 疏附县|