> 财经
深入理解java字节码(java字节码的解释程序)
导语:从java字节码层面来理解i++和++i的区别
关于i++和++i的区别,在学习编程语言的时候都知道i++是先赋值后自增,++i是先自增再赋值。
那么事实真是这样么。
接下来让我们深入到编译后的字节码层面上来了解i++和++i的实现原理,先来看一段代码:
如果按原先定义,就应该是x = x;x = x+1; 那么结果就应该是1;但是很遗憾结果是0;
将上面的源代码编译之后,使用javap命令查看编译生成的代码(忽略次要代码)如下:
iinc指令:该指令用于对本地(局部)变量进行自增减操作。该指令第一参数为本地变量的编号,第二个参数为自增减的数量。
下面我就根据上面的字节码指令来描述局部变量表和操作数栈的变化情况。
1、iconst_0:将操作数0入栈:
2、 istore_1:将操作数栈顶数据出栈并存储到局部变量表的第1个位置
3、 Iload_1:将局部变量表的第1个位置的值复制到操作数栈中
4、 Iinc: 将局部变量表第1个位置的值加1,此时x的值为1
5、 istore_1:将操作数栈顶数据出栈并存储到局部变量表的第1个位置
上面的演示过程清楚的表达了最终结果为0的原因了。
接下来我们将上面的代码稍微作下修改,将"++"移动前面来,如下:
我们再来看下这段代码生成的字节码:
这段代码与上面的区别就在于:iload_1指令在iinc指令后面执行,所以复制到操作数栈的值是自增后的值,所以这里的结果就是1。
下面这段代码的结果留给读者分析:
本文内容由快快网络小姬创作整理编辑!