数值计算i++,++i原理剖析

数值计算

学习java虚拟机是怎么计算两个数的,特别是有i++ 和 ++i 这些场景的时候。

总结

  1. 赋值“=” 是最后计算的,右边所有的计算完成才会进行赋值。
  2. =右边的数按照从左到右的顺序压入到操作数栈中。
  3. 不同运算符计算的顺序按照运算符的优先级。
  4. 自增(i++,++i),自减(i–,--i)都是直接修改变量的值,不会经过操作数栈。
  5. 赋值前的临时结果也放在操作数栈中。

题目:

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值