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

只有注册用户登录后才能发表评论。


网站导航: