Java中i=i++的问题
遇到了这个困惑,都是个人理解,如有错误,烦请指正!
public class Test {
public static void main(String[] args) {
int i = 10;
i = i++;
System.out.println(i);
}
}
上述代码输出结果为:10
一开始可能会奇怪,i 在赋值之后还是对自身进行+1了,应该输出11呀?
原理 :
通过反编译class文件可以看到:

这里先将i压入栈顶,而后执行i+1操作,但是此时执行i+1的值是在局部变量表中,然后将i从栈中取出打印,此时栈中的元素还是10,所以打印是10;
但是为什么会编译成这种步骤呢?
我将i++变成++i后反编译发现:

压栈操作被放到了后面。
个人理解 :
这里的赋值操作是由istore和iload组成(涉及到了运算,如果只是单纯的将一个常数赋值的话,bipush和istore组成,可以看看虚拟机指令集了),iload是将数据压入栈中,istore是将数据从栈顶放到指定的局部变量中。
然后具体编译后的class规则,可以参照符号优先级判断,例如:


这里的编译后的执行顺序是根据优先级来的,然而++放在前面或者后面,则通过改变iload的位置来实现,真是非常巧妙的设计。
关于计算过程中的压栈操作,可以学一学逆波兰表示法,能够很容易明白栈在计算过程中的作用。另外,真应该好好学学编译原理了。。。。

浙公网安备 33010602011771号