从字节码角度解析Java中i++和++i原理
Java中i++和++i原理解析
1. 直接上代码:
public class Test {
public static void main(String[] args) {
int i = 0,j = 0;
i=i++;
j=++j;
System.out.println(i);
System.out.println(j);
}
}
2. 执行结果
0
1
3. 反编译class文件输出:
javac Test.java
javap -c Test.class >> Test_class_compile.txt
Compiled from "Test.java"
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iconst_0
3: istore_2
4: iload_1
5: iinc 1, 1
8: istore_1
9: iinc 2, 1
12: iload_2
13: istore_2
14: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
17: iload_1
18: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
21: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
24: iload_2
25: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
28: return
}
4. 字节码执行过程解释
5. 总结
i=i++
的过程实际上就是先加载i到操作栈中,然后再执行++
运算,即直接对局部变量表中i的值+1
,然后直接将栈顶的值赋值给局部变量表中i
的位置j=++j
的过程实际上就是先对局部变量表中的j
的值+1
,然后将局部变量j
的值加载到操作栈中,最后将栈顶元素赋值给局部变量j
,因此j=++j
与++j
是等价的,因为压栈和出栈是连续的两个过程,即什么都没改变
6. 推广
- 同理,如表达式
(a++ + a--)
,假设初始时a=10
,那么此表达式执行过程实际上就是先加载局部变量a
的值到操作栈中,然后++
对局部变量表中a
的值直接+1
,根据运算符优先级,然后再次加载a
的值到栈中(此时a
值为11
),然后--
对局部变量表中a
的值直接-1
,最后才进行加法运算+
,即直接将操作栈顶两个与元素相加(此时操作栈中元素为11
和10
),故最后此表达式的结果为21
7. 参考资料
《深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)》