Java基础:i++和++i的原理解析
以前只是知道i++和++i的运算结果不明其在JVN中的运算原理,今天在次遇到这个问题,为解答心中疑惑用javap反编译class文件查到了其中原理,本篇博客对此问题进行分享总结。
1.问题代码
public class Test {
public static void main(String[] args) {
int i = 2;
int a = i++ + ++i;
System.out.println(a);
i = 2;
a = ++i + i++;
System.out.println(a);
}
}
大家可用先想一下,上面代码的运行结果。相信具有Java基础的同学都可以算出结果。
是的,两个结果都是6。
2.原理解析
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=3, args_size=1
0: iconst_2
1: istore_1
2: iload_1
3: iinc 1, 1
6: iinc 1, 1
9: iload_1
10: iadd
11: istore_2
12: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
15: iload_2
16: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
19: iconst_2
20: istore_1
21: iinc 1, 1
24: iload_1
25: iload_1
26: iinc 1, 1
29: iadd
30: istore_2
31: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
34: iload_2
35: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
38: return
LineNumberTable:
line 5: 0
line 6: 2
line 7: 12
line 8: 19
line 9: 21
line 10: 31
line 11: 38
}
对JVM指令不熟悉的同学可以对照JVM指令表查看上面代码。重点在指令行号为2、3、6、9、21、24、25、26。
i++ + ++i
(iload_1 ,此时将i++的i推送到栈顶,用于后面的加运算)将第二个int型本地变量推送至栈顶i为2,(iinc 1,1)将局部变量表位置1的变量值加1(局部变量表从0开始,一般情况位置0为this)i为3,(iinc 1,1)再次将局部变量表位置1的变量值加1i为4,(iload_1 ,此时将++i的i推送到栈顶,用于后面的加运算)再次将第二个int型本地变量推送至栈顶i为4。(iadd)将栈顶元素相加(2+4=6)。
++i + i++
原理与上面相同,只是顺序不同。同学们可以自己推理一下。