小雨
V1
2022/03/07阅读:36主题:全栈蓝
你真的会 i++吗
你真的会 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虚拟机规范》关于指令的部分
作者介绍
小雨
V1