有如下一段代码,可以先尝试计算一些运行的结果
public static void main(String[] 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); }
.
.
.
.
.
.
.
.
.
.
.
.
运行结果
i=4
j=1
k=11
分析如下
int i=1;
这句执行结束后局部变量表中i
的值就为1
i=i++;
执行这一句过程如下
①把i
的值压入操作数栈,那么操作数栈中值为1
②执行i++
操作,那么局部变量表中i
的值为2
③最后执行赋值
操作,把操作数栈中的值赋值给i
,于是局部变量表中i
的值被覆盖,变成1,因此i=1
int j=i++
①先把i
的值压入操作数栈,那么操作数栈中值为1
②执行i++
操作,局部变量表中i的值就变为2
③最后执行赋值
操作,此时操作数栈中的值为1,因此j
赋值为1,此时j=1,i=2
int k=i + ++i * i++;
虽然是先算乘法,但是压入操作数栈的过程是从左到右
因此过程如下
①先将i
的值压入操作数栈,操作数栈的值为2
②执行++i
操作,那么局部变量表中i
的值就变为3
③注意,由于等式右边的计算尚未结束,因此i
的值要压入操作数栈,因此栈中有两个元素,[2,3]
(右边为栈顶)
④执行i++
,先将i
的值压入操作数栈,此时栈中有三个元素,[2,3,3]
(右边为栈顶),然后执行i自增
,局部变量表中i
的值就变为4
⑤把操作数栈中前两个数弹出,执行乘积操作,3*3=9
,那么把9
压到操作数栈中,此时栈中有两个元素,[2,9]
(右边为栈顶)
⑥把操作数栈中前两个数弹出,执行加法操作,9+2=11
⑦此时等式右边已经计算完成,赋值给k,所以k=11
因此答案为
i=4
j=1
k=11