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