先来看看下面的代码:
-
public class test {
-
public static void main(String[] args) {
-
int i = 1;
-
i = i++;
-
int j = i++;
-
int k = i + ++i * i++;
-
System.out.println(i);
-
System.out.println(j);
-
System.out.println(k);
-
}
-
}
先来分析第4行:
这是经典题目i=i++;,可以扯出Java的特性
首先先算等号右边,i++,然后由于i++是先用后加,当然看似先用后加,其实虚拟机是先把这个操作数做一个备份,然后再原数上加,赋值时候把这个备份赋值出去,所以我们执行如下操作:
-
把i值压入操作数栈,因为运算过程是要在操作数栈中进行
-
i变量自增,局部变量表中的i变成2
-
我们刚刚算的是整个右边的结果2,然后把备份赋值出去
因此i=i++;这句话结果是i没有自增。
接下来分析第5行:
这时候还备份时,还给的是j所以i自增的值被保留下来了
接下来看第6行:
- 把i的值压入操作数栈
- 后面一个++i,i变量自增1,变成3
- 执行完后的得数都会被压入操作数栈【局部量表:3 操作数栈:3/2】
- i++ 把i的值压入操作数栈【局部量表:3 操作数栈:3/3/2】
- i变量自增 【局部量表:4 操作数栈:3/3/2】
- 把操作数栈中前两个弹出求乘积结果再压入栈【局部量表:4 操作数栈:9/2】
- 把操作数中的值弹出求和赋值求和给k【局部量表:4 操作数栈:空】
大家可以仿造我们初学栈时老师给的表达式求值的算法题,来模拟上述过程。