先看一道题:
写出下面代码的执行结果:
public static void main(Stringl] args) {
int i= 1;
i= i++;
int j = i++;
int k =i+ ++i* i++;
System.out.println("i=" + i);
System.out.println("j=" + j);
System.out.println("k=" + k);
}
很不幸,这题我做错了。。
4,1,11
最终输出结果如上。
分析如下:
首先要知道几个概念:
操作数栈
局部变量表
赋值操作规则
等号左边的i 在局部变量表里,等号右边的i++ 结果 是存放在操作数栈内
i=i++;
1、= 是最后计算的,右边的操作是要压入操作数栈的。
1,左边变量表i=1, 右边 i=1,先将1压入操作数栈
2、自增操作 :左边的变量 自增,变成了2,但是右边 操作数栈内的 值 仍然为1
3、赋值,右边操作数栈的内容,覆盖了 左边的局部变量i (i=2) ,此时,左边的i 再 次变成1;
int j=i++;
2、由于 i 的结果是1,压入操作数栈,所以,j =1,此时 i 又进行了自增(在 i 的 局部变量表中)
int k=i+ ++i *i++;
3、i =2 压入操作数栈,先算等号右边(等号右边的压栈顺序是从左到右的),最后 再赋值
1)i=2 压栈
2)++i ,i 自增 i=3,压入操作数栈
2)3*3=9 压入操作数栈
3) i++ 自增 ,i=4,更新 int i 局部变量表
4)2+9 =11 压入操作数栈
5)执行赋值操作,k=11
本题关键点:
1、操作数栈
2、先算等号右边 最后再赋值
3、等号右边的从左到右依次压栈
4、自加运算 是不进入操作数栈的,直接在局部变量表里操作。
4、具体怎么计算,依据运算符优先级