题目如下
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 虚拟机关于指令部分
- 前置++和后置++问题
- 运算符的优先级
int j = i++; 和上面的 i=i++同理!
此时 i 的值为 2,然后运行如下
int k = i + ++i i++; =》 2+ 33 = 11
i 最开始为的值 2, i 入操作数栈时 ++i =3,此时操作数的值为 3,而后面的 i++,i 的值也是为 3,所以最终的结果=11
正确结果
运行结果为:i=4,j=1,k=11小结
- 赋值= 最后计算
- =右边的从左到右加载值依次压入操作数栈
- 实际先算哪个,看运算符优先级
- 自增、自减操作都是直接修改变量的值,不经过操作数栈
- 最后的赋值之前,临时结果也是存储在操作数栈中
- 建议:阅读一下《JVM 虚拟机规范》关于指令的部分
推荐阅读
- 数据结构|Lambda 表达式 - java - 细节狂魔
- 中间件|Apache Member、ALC Beijing 发起人姜宁(一个人走的很快,但是一群人能走得更远)
- netty实战|Netty进阶 -- 非阻塞网络编程 实现群聊+私聊+心跳检测系统
- leetcode|LeetCode --- 经典算法题之二分查找三回合
- netty实战|Netty入门 -- 什么是Netty()
- 程序人生|【回顾 2021,展望 2022】 一同来见证辉煌人生 一个准职场人的一年~
- 前后端分离|前后端分离 --- 深入浅出Spring Boot + Vue实现员工管理系统 Vue如此简单~
- 一文理解乐观锁与悲观锁
- 算法初探|八大经典排序算法(java)