日期:2014-05-20  浏览次数:20606 次

i++大问题,谢谢!
为什么运行   i=i++   后               i值不变?
例子:
public   class   temp   {
public   static   void   main(String[]   args)   {
int   i=0;
i=i++;
System.out.println(i);
}
}
运行后输出0

我认为i=i++这句是下面两句的合成
i=i;
i++;

可是...不对啊...为什么?

------解决方案--------------------
楼主一说才注意到.的确是个问题
看看这两句:
int i=0;
i=i++;
对应的虚拟机指令:
0: iconst_0 //常量0压栈
1: istore_1 //将常量0存到局部变量区 "1 "的位置.这个时候这个 "1 "位置的值是0
2: iload_1 //读出局部变量区 "1 "位置的值,并压栈.这个时候这个 "1 "位置的值还是是0
3: iinc 1, 1 //最恶心的这句...这是对 "++ "操作的指令优化,
直接将局部变量区 "1 "位 置的值+1.这个时候这个 "1 "位置的值变成1了
6: istore_1 //将刚才压入栈的值再存回局部变量区 "1 "的位置.
这个时候这个 "1 "位置的值又变回0了....

------解决方案--------------------
javap -verbose
------解决方案--------------------
这和虚拟机的实现有关 如在C++中 计算结果是i=1 ,Java中的计算结果是i=0
------解决方案--------------------
直接在栈里面操作是很合理的优化,省掉了存取步骤,没什么好恶心的

有问题,用JAVAP