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
小力力力 阅读(279)
评论(0) 编辑 收藏 所属分类:
JAVA