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();
}
}
結果是0,為什么呢 ?
|
回復人: blackhost(劍心) ( ) 信譽:98 |
2005-3-27 16:42:06 |
得分: 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 2005-03-28 13:59
小力力力 閱讀(284)
評論(0) 編輯 收藏 所屬分類:
JAVA