遇到一个比较有意思的题目,看上去很简单,实际运行起来却不是那么回事了。会发现i=i++和i++两者运行结果居然不一样!
主要是没理解清楚java方法执行时,局部变量和操作数栈的分配运行机制,这就分享给大家分析过程:
示例代码如下,执行结果应该是:
1
0
public class AutoIncrement {
public static void main(String[] args) {
int i = 0;
i++;//相当于i=i+1;
/*
步骤说明:
1、将局部变量i的值0 load到操作数栈
局部变量 i=0
操作数栈 0
2、将局部变量i的值自增1
局部变量 i=1
操作数栈 0
3、将操作数栈i的值弹出,但是并没有赋值操作
局部变量 i=1
操作数栈
*/
System.out.println(i);//i=1
int j = 0;
j=j++;
/*
步骤说明:
1、将局部变量j的值0 load到操作数栈
局部变量 j=0
操作数栈 0
2、将局部变量j的值自增1
局部变量 j=1
操作数栈 0
3、将操作数栈j的值0弹出,并赋值给局部变量j(*故虽然j的值曾经的确加1了,但是又被这一步骤的0覆盖了*)
局部变量 j=0
操作数栈
*/
System.out.println(j);
}