看到过的一个说法:
对语句进行拆解
左值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 语句必须先发生。
如有错误,欢迎指导