一道i++ 和++i 考验Java底层知识
/**
* @author wasai
* @date 2021-03-09 17:47:30
*/
public class ADDSUBTest {
public static void main(String[] args) {
int i = 1;
i = i++;
int j = i++;
int k = i + ++i * i++;
System.out.println("i = "+i);
System.out.println("j = "+j);
System.out.println("k = "+k);
}
}
结果:
i = 4
j = 1
k = 11
考察知识点
想要彻底搞明白我们就需要了解几个概念:
- 栈帧:栈帧是每个线程私有的,其实就对应这一个方法,在一个线程中每个方法都会对应一个栈帧,当方法执行完毕后栈帧就消失。
- 局部变量表:可以理解为方法中的变量都是存在这个地方的。
- 操作数栈:方法中的计算操作都是在这里完成的。
- 注意:变量的++,-- 操作都是直接改变的局部变量表中完成的。(这对于这道题的理解非常重要)
接下来就可以看这道题了:
public class ADDSUBTest {
public static void main(String[] args) {
//向局部变量表中放入了i=1
int i = 1;
//第一步:将局部变量表中i的值压入操作数栈 此时操作数栈中的值是1
//第二步:对i进行++,局部变量表表中的i变为2(++ -- 操作都是直接改变局部变量表中的值)
//第三步:将操作数栈中的值付赋给局部变量中的i,此时局部变量中的i变为1
i = i++;
//第一步:将局部变量表中i的值压入操作数栈 此时操作数栈中的值是1
//第二步:对i进行++,局部变量表表中的i变为2 (++ -- 操作都是直接改变局部变量表中的值)
//第三步:将操作数栈中的值付赋给局部变量中的j,此时局部变量中的i变为2,j为1
int j = i++;
//像这种复杂计算,过程其实就是先将数和符号压入操作数栈,最后计算
//第一步:将局部变量表中的i压入操作数栈,i的值为2
//第二步:由于是++i,则先加再压入操作数栈,则操作数中又压入3
//第三步:先向操作数栈压入3,然后对i进行++,局部变量表中i的值又变为4l
//最后操作数栈中其实就是 2 + 3 * 3 算出来等于11,然后赋值给局部变量表中的k。
int k = i + ++i * i++;
//局部变量表中的值:i=4 j=1 k=11
System.out.println("i = "+i);
System.out.println("j = "+j);
System.out.println("k = "+k);
}
}
深入研究:通过javap命令可以看到class文件的反编译文件,可以大概看清楚过程。