JVM 使用javap反编译命令解释i++和++i的区别

xiaoxiao2021-02-27  237

一个简单的例子

public class Test{ public static void main(String[] args){ int i = 0; int j = 1; int k = 2; i = i++; j = ++j; k += 2; } }

输出结果我们知道是

0 2 4

使用javap命令反编译一下

分析一下得到的输出结果

public static void main(java.lang.String[]); Code: 0: iconst_0 1: istore_1 2: iconst_1 3: istore_2 4: iconst_2 5: istore_3 6: iload_1 7: iinc 1, 1 10: istore_1 11: iinc 2, 1 14: iload_2 15: istore_2 16: iinc 3, 2 19: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 22: iload_1 23: invokevirtual #3 // Method java/io/PrintStream.println:(I)V 26: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 29: iload_2 30: invokevirtual #3 // Method java/io/PrintStream.println:(I)V 33: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 36: iload_3 37: invokevirtual #3 // Method java/io/PrintStream.println:(I)V 40: return }

前面6条指令分别给i,j,k变量进行赋值,即 0: iconst_0—–把常量0入栈 1: istore_1——把栈顶元素(0)存入第一个变量i中 2: iconst_1—–把常量1入栈 3: istore_2—–把栈顶元素(1)存入第二个变量j中 4:iconst_2—–把常量2入栈 5: istore_3—–把栈顶元素(2)存入第三个变量k中

接下来的 6,7,10对应的代码是i = i++; 6: iload_1——把第一个变量的值压入栈 7:iinc 1, 1——第一个变量的值加1 10: istore_1——把栈顶元素存入第一个变量i

我们可以知道这里的操作类似于

int temp = i; i = i+1; i = temp;

因此i的值并没有发生变化

11,14,15对应的是j = ++j;

11: iinc 2, 1—–把第二个变量j的值加1 14: iload_2—-把第二个变量是j的值压入栈 15: istore_2—-把栈顶元素存入第二个变量j中

操作类似于

i = i+1; int temp = i; i = temp;

j的值是发生了改变的

16对应的就是k += 2;

16: iinc 3, 2—把第三变量的值加二

因此k的值是4


转载请注明原文地址: https://www.6miu.com/read-10765.html

最新回复(0)