i++和++i到底有什么区别

先写一段java测试代码

public void testInc() {
        int i = 0;
        int b = i++;
        int c = ++i;
    }

编译成jvm指令后如下:

 0 iconst_0 // 将常量0入栈
 1 istore_1 // 将栈顶的i数据出栈保存到局部变量表索引为1的位置
 2 iload_1 // 将局部变量表索引为1的变量入栈
 3 iinc 1 by 1 // 局部变量表索引为1的变量递增
 6 istore_2 // 将栈顶的数据保存到局部变量表索引为2的位置
 7 iinc 1 by 1 // 局部变量表索引为1的变量递增
10 iload_1  // 将局部变量表索引为1的变量入栈
11 istore_3 // 将栈顶的数据保存到局部变量表索引为3的位置
12 return

数据变化过程是这样子的:
开始前:i未初始化;b未初始化;c未初始化;操作数栈=[];
0行指令: i、b、c保持不变;操作数栈=[0];
1行指令: i=0;b、c保持不变;操作数栈=[];
2行指令:i=0;b、c保持不变;操作数栈=[0];
3行指令:i=1;b、c保持不变;操作数栈=[0];
6行指令:i=1;b=0;c保持不变;操作数栈=[];
7行指令:i=2;b=0;c保持不变;操作数栈=[];
6行指令:i=2;b=0;c保持不变;操作数栈=[2];
7行指令:i=2;b=0;c=2;操作数栈=[];

总结:
共同点:都是先将局部变量入栈,然后出栈保存到局部变量表。
不同点:i++是先入栈再递增;i++是先递增再入栈。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容