在 Java 中,前自增和后自增运算符的差异体现在 变量值的修改顺序 和 表达式返回值的时机。通过 JVM 字节码分析可以清晰理解其底层逻辑。
操作类型 | 表达式返回值 | 变量自增时机 | 字节码执行顺序(以int为例) |
|---|---|---|---|
前自增 | 返回自增后的值 | 先自增,再返回值 | iinc → iload |
后自增 | 返回自增前的值 | 先返回值,再自增 | iload → iinc |
示例代码和字节码分析
public class ArithmeticDemo {
public static void main(String[] args) {
int x = 1;
x = x++;
System.out.println(x);
}
}查看JVM加载后的字节码指令操作过程:
0 iconst_1 常量加载:常量1压入操作数栈
1 istore_1 局部变量存储:常量1存储到局部变量表索引1的位置(索引1:x=1)
2 iload_1 局部变量获取:将索引1的值加载到栈顶(栈顶值:1)
3 iinc 1 by 1 算术运算:对索引1位置的值自增1(x=2)
6 istore_1 将栈顶的值存储到索引1位置(索引1:x=1)
7 getstatic #7 <java/lang/System.out : Ljava/io/PrintStream;> 访问静态字段
10 iload_1 加载索引1位置的值
11 invokevirtual #13 <java/io/PrintStream.println : (I)V> 调用println形参为int类型的方法并打印
14 return 方法返回
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。