java语言中 i = i++ 初学笔记

本人初学者,最近遇到这样一个问题:

public class testInc {
	
	public static void main(String[] args) {
		int i = 0;
		i = i++;
		System.out.println(i);
		//System.out.println(j);
	}
}

输出结果是 0.

一开始很费解,于是用javap反汇编了一下,才逐渐了解原因。


可以看到流程为

iconst_0  表示将常数0存入栈,栈顶为0

istore_1   表示从栈顶pop存入变量1(即i),此处即 i = 0,此时栈为空

iload_1    表示将变量1push入栈,栈顶为0

iinc            表示对变量1自增1,此时 i = 1

istore_1   表示从栈顶pop存入变量1,此时 i = 0

可知上一步自增的结果被再次从栈pop并存储的操作给覆盖了,这就是结果为0的原因。


另外,如果将代码改为如下,

public class testInc {
	
	public static void main(String[] args) {
		int i = 0;
		int j = i++;
		System.out.println(j);
		//System.out.println(j);
	}
}
结果仍为0

反汇编结果如图



也没什么结论,因为没做进一步分析,也不是很了解jvm,简单来看就是java中操作数都在栈中,总之iinc指令很奇怪。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值