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 阅读(144)
评论(0) 编辑 收藏 所属分类:
Java技术