笔试面试题临时
# 笔试面试题临时
# 自增变量
请问下面程序的运行结果:
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
核心字节码:
0 iconst_1
1 istore_1
// 以上为 int i = 1; i存储在局部变量表中,值为1。
2 iload_1 // 把i的值压入操作数栈
3 iinc 1 by 1 // 局部变量表i自增1
6 istore_1 // 把操作数栈中的值赋值给i(由2又被赋值为1)
// 以上为i = i++; 此刻,i = 1
7 iload_1
8 iinc 1 by 1
11 istore_2
// 以上为int j = i++;与上一句相似,不过赋值对象不同。此刻,i = 2, j = 1
12 iload_1 // i(2)压入操作数栈
13 iinc 1 by 1 // ++i,先局部变量表i自增1,变成3
16 iload_1 // 后将i(3)压入操作数栈
17 iload_1 // i++,将i(3)压入操作数栈
18 iinc 1 by 1 // 后局部变量表i自增1,变成4
21 imul // 此时,栈由定至低为 3 3 2, 3*3 = 9
22 iadd // 9 + 2 = 11
23 istore_3 // 11 赋值给 k
// 以上为int k = i + ++i * i++; 虽然复杂,但是从左依次压入操作数栈分析即可。
核心知识点:
- =赋值运算优先级最低,最后计算;
- =右边的从左到右加载值,依次压入操作数栈,运算顺序由运算符优先级而定
- 自增、自减操作都是直接本地变量表中的值,不经过操作数栈。++或者--在前代表
- =赋值之前,临时结果存储在操作数栈中
上次更新: 5/31/2023, 1:14:42 AM