栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数值计算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。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/644166.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号