自增与自减的机制——为什么 int i = 0; i = i++; i 的结果为0?

本文详细探讨了Java中自增自减操作符的工作原理,通过JVM字节码指令分析了i = i++的结果为0的原因。解释了在自增操作中,局部变量表的值被更新,但操作数栈中的值并未改变,导致最终赋值时覆盖了自增的结果。
摘要由CSDN通过智能技术生成

1.问题

Java 中运行以下代码 :

public static int test() {
		int i = 0;
		i = i++;
		return i;
}

返回结果为:0

2.JVM执行的代码

直接在Windows命令窗口中使用 javap -c XXX 查看JVM执行的代码:

public static int test();
  Code:
     0: iconst_0
     1: istore_0
     2: iload_0
     3: iinc          0, 1
     6: istore_0
     7: iload_0
     8: ireturn

JVM调用执行该方法时,对应栈帧(Stack Frame) 在虚拟机中入栈;栈帧中包含:局部变量表、操作数栈、动态链接、方法返回地址等信息。

局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量,i就放在局部变量表中;而操作数栈是一个后入先出的栈,用于方法的计算。

3.现在来看看JVM的字节码指令

  • 0: iconst_0 --> 将int类型的0入栈,即放到操作数栈的栈顶
  • 1: istore_0 --> 将操作数栈顶元素 0 弹出,存入局部变量表的0号索引位上(这是个静态方法,第0位不用存放当前对象的引用)
  • 2: iload_0 --> 将局部变量表的0号索引位的
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值