之前老师在上课中提到,后自增符号是先以原值参与其他运算再进行自增运算。考虑到后自增结果只能为右值,于是尝试了以下段代码:
int a=0;
a=a++;
打印a的值为0,也就是说并非是简单地先将a的值赋给a,然后再进行自增运算。
参考以下一个关于变量id的自增操作
【Kevin原创】关于Java自增操作的原子性
public void getNext();
Code:
0: aload_0 //加载局部变量表index为0的变量,在这里是this
1: dup //将当前栈顶的对象引用复制一份
2: getfield #2; //Field id:I,获取id的值,并将其值压入栈顶
5: iconst_1 //将int型的值1压入栈顶
6: iadd //将栈顶两个int类型的元素相加,并将其值压入栈顶
7: putfield #2; //Field id:I,将栈顶的值赋值给id
10: return
}
可以看到对变量有个先取值再赋值的过程。看起来java的后自增操作的实现应该类似于这样:
(伪码)
int increment(a){ //对a进行后自增操作
temp = a ; //将a的值拷贝给一个临时变量
a=a+1; //将a+1的值给a
return temp;
}
也就是说,后自增操作一旦发生,则同时产生了一个temp变量以及将a的值增加了1。然后temp变量参与外部运算。这可以解释
int a=0;
a=a++;
执行后打印a的值为什么是0,因为a=a++的操作是先将0赋给一个临时变量temp,然后a变成1,最后把temp中的0再给a。
我们还可以看下面一个例子:
int a=0;
int b=a++ + ++a;
输出结果b=2,执行过程为b=temp(0)+a(1+1)。