JVM层面的i++和++i——不一样的解答
程序员文章站
2024-01-26 10:02:04
...
直接上代码
public class Demo {
public void testIPlus() {
int i = 0;
int j = i++;
}
public void testPlusI() {
int i = 0;
int j = ++i;
}
}
查看字节码文件
public void testIPlus();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=3, args_size=1
0: iconst_0
1: istore_1
2: iload_1
3: iinc 1, 1
6: istore_2
7: return
LineNumberTable:
line 3: 0
line 4: 2
line 5: 7
public void testPlusI();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=3, args_size=1
0: iconst_0
1: istore_1
2: iinc 1, 1
5: iload_1
6: istore_2
7: return
LineNumberTable:
line 8: 0
line 9: 2
line 10: 7
}
分析:先给出字节码含义
i++:
0: iconst_0//常量0
1: istore_1//将常量0赋值给变量1即i
2: iload_1//将第一个变量i压入栈
3: iinc 1, 1//i自增1,这里栈中的i并没有变化
6: istore_2//将栈中的i付给第二个参数即j
++i:
0: iconst_0 //常量0
1: istore_1//将常量0赋值给变量1即i
2: iinc 1, 1//i自增1,此时i还没有入栈
5: iload_1//将第一个变量i压入栈 此时i已经自增
6: istore_2//将栈中的i赋值给第二个参数即j
总结:i++先入栈,再在自己的空间中自增,不会引起栈中的变量变化,然后在返回
++i先自增,在入栈,然后出栈,栈中的值已经自增过
上一篇: 安装webpack的步骤教程