栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

你真的会 i++吗

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

你真的会 i++吗

题目如下
    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);
    }

最开始看到这题目觉得很简单,我以为就是普通的前置++和后置++的问题,没想到藏着这么多的坑,一开始我算出来的结果是
i=5,j=2,k=15
怎么算出来的,i 经过 4 次++,所以 i 为 5,j=i++的时候,i 为 2,因为是后置++,所以赋值后再进行++,所以 j=2, k = 3 + 4 * 3 结果为 15,没有想到自己全错了,希望大家引以为戒

本题考点

JVM 虚拟机关于指令部分前置++和后置++问题运算符的优先级 题解

i = i++, 因为 i 入栈之前的值为 1,在栈外++后,局部变量的 i 的值变为 2,但是=赋值操作会把栈里面的值赋值给 i,所以 i 的结果为 1
int j = i++; 和上面的 i=i++同理!
此时 i 的值为 2,然后运行如下
int k = i + ++i * i++; =》 2+ 3*3 = 11
i 最开始为的值 2, i 入操作数栈时 ++i =3,此时操作数的值为 3,而后面的 i++,i 的值也是为 3,所以最终的结果=11

正确结果

运行结果为:i=4,j=1,k=11

小结

赋值= 最后计算=右边的从左到右加载值依次压入操作数栈实际先算哪个,看运算符优先级自增、自减操作都是直接修改变量的值,不经过操作数栈最后的赋值之前,临时结果也是存储在操作数栈中建议:阅读一下《JVM 虚拟机规范》关于指令的部分

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

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

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