Java 中 int i = 0; i = i ++;为什么i还等于0

看到过的一个说法:

对语句进行拆解
左值i先将值赋给temp,然后自加,最后temp赋值给i;
在Java中的确是这么做的,具体步骤如下
注:本文解释只适合Java。

实际执行步骤

编译后代码的解释,参考 https://blog.csdn.net/xialei199023/article/details/76383013
先定义如下一个类:

public class Test{
	void testi() {
		int i = 0;
		i = i++;
	}
}

编译后的代码如下:

void testi();
    Code:
       0: iconst_0       // 生成整数0
       1: istore_1       // 将整数0赋值给1号存储单元(即变量i,i=0)
       2: iload_1        // 将1号存储单元的值加载到数据栈(此时 i=0,栈顶值为0)
       3: iinc      1,1   // 1号存储单元的值+1(此时 i=1)
       4: istore_1      // 将数据栈顶的值(0)取出来赋值给1号存储单元(即变量i,此时i=0)     
       5: return

i = i ++;
此语句包含两个操作:自加操作和赋值操作
  赋值操作被编译成两条命令,即iload_?(取值,?代表取哪里的值,即右值)和istore_?(存值,即左值,存到声明时分配的存储单元)
  自加操作直接在储存单元中,进行自加。

  所以i = i ++ ;就可以解释为:
  先将i的值取出放到数据栈(iload_1),然后i发生自加,此时1号存储单元值变为1;最后将数据栈中的值 0 弹出,赋给i(istore_1),此时1号存储单元原来的值被 0 覆盖。

此处还有一个问题就是
  iinc 1,1和istore_1的先后问题:
原理不难解释:
  赋值操作应该在右表达式完成后才可以赋值,例如语句为 j = i ++ + i ++; iinc 语句必须先发生。
如有错误,欢迎指导

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值