数值计算
学习java虚拟机是怎么计算两个数的,特别是有i++ 和 ++i 这些场景的时候。
总结
- 赋值“=” 是最后计算的,右边所有的计算完成才会进行赋值。
- =右边的数按照从左到右的顺序压入到操作数栈中。
- 不同运算符计算的顺序按照运算符的优先级。
- 自增(i++,++i),自减(i–,--i)都是直接修改变量的值,不会经过操作数栈。
- 赋值前的临时结果也放在操作数栈中。
题目:
public static void main(String[] args) {
int i = 1;
i = i++;
int j = i++;
int k = i + ++i * i++;
//此时的i,j,k分别是多少???
System.out.println(i); //4
System.out.println(j); //1
System.out.println(k); //11
}
理由如下:
首先要知道java虚拟机在计算的时候有 堆 和 栈,计算的时候就是操作数栈。
第一行 int i = 1;
过程如下:1会压入操作数栈,然后执行=的赋值操作,把1赋值给i。所以i=1.
第二行 i = i++;
过程如下: 赋值都是最后计算的,所以肯定是先计算右边的,即计算 i++;因为++是在数的右边,所以会把i的值1压入操作数栈;然后执行 i++操作, ++的操作是不需要经过操作数栈的,所以会直接把i的值改成2。 第三部才是执行 =等号的 赋值操作,因为此时栈中的数依旧是1,所以重新把 1 赋值给了i,i从2变回了1。 所以这一步执行完之后,i还是1。
第三行 int j = i++;
过程如下: 和第二部类似,不过最后赋值是赋值给了j。 首先,i的值1入栈,然后计算i++,所以i的值变成了2。此时操作数栈中的值还是1,执行赋值,就会把这个数1赋值给j,所以j就变成了1。 这行代码执行完之后,i = 2, j = 1。
第四行 int k = i + ++i * i++;
过程如下: 首先i的值2压入操作数栈中。 然后遇到 ++i
因为++在前面,所以先计算,此时i更新为3,然后会把3压入操作数栈中。然后再遇到 i++
,++在后面,所以i的值3先入栈,此时操作数栈从下到上为 2 3 3。然后计算 i++ ,所以 i 的值就变成4。 然后计算乘法, 3 * 3 = 9再次压入操作数栈,然后再计算加法, 2 + 9 = 11。 最后进行赋值操作,会把操作数栈中最后的结果11赋值给k。 所以经过这行代码之后, i = 4, j 不变,还是 1, k = 11。