java学习(12):i++和++i的区别
作者:互联网
先上代码:
public static void main(String args[]) {
int A = 1;
int B = 10;
int C = 100;
int D = 1000;
System.out.println(A++);
System.out.println(++B);
System.out.println(C++ + C++);
System.out.println(C);
System.out.println(D++ + ++D);
System.out.println(D);
}
在来运行结果:
1
11
201
102
2002
1002
Process finished with exit code 0
Reason:
前两个可能大家都比较容易理解,我们这里只简单的介绍后两个原因:
(1)C++ + C++:
36: iload_3
37: iinc 3, 1
40: iload_3
41: iinc 3, 1
44: iadd
45: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
48: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
51: iload_3
52: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
55: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
上面是(1)相关操作的JVM字节码:
36-iload_3操作:JVM首先将局部变量表中位置为3的元素(即100)压入栈顶。
37-iinc 3, 1操作:然后将局部变量表中位置为3的元素的值进行了+1的操作,注意此时栈顶元素的值并未变化,仍为100。
40-iload_3操作:JVM再次将局部变量表中位置为3的元素(即101)压入栈顶。
41-iinc 3, 1操作:然后再次将局部变量表中位置为3的元素的值进行了+1的操作,此时局部变量表中位置为3的元素的值变成102。
44-iadd操作:将栈顶的两个元素101及100相加再次压入栈顶,此时栈顶元素变成了201.
45、48操作:print栈顶元素的值,结果输出201
51-iload_3操作:将局部变量表中位置为3的元素(即102)压入栈顶。
52、55操作:print栈顶元素的值,结果输出102
(2)D++ + ++D:
58: iload 4
60: iinc 4, 1
63: iinc 4, 1
66: iload 4
68: iadd
69: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
72: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
75: iload 4
77: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
上面是(2)相关操作的JVM字节码:
58-iload_4操作:JVM首先将局部变量表中位置为4的元素(即1000)压入栈顶。
60-iinc 4, 1操作:然后将局部变量表中位置为4的元素的值进行了+1的操作,注意此时栈顶元素的值并未变化,仍为1000。
63-iinc 4, 1操作:JVM再次将局部变量表中位置为4的值进行了+1的操作,此时值变成了1002。
66–iload_4操作:JVM再次将局部变量表中位置为4的元素压入栈顶。
68-iadd操作:将栈顶的两个元素1002及1000相加再次压入栈顶,此时栈顶元素变成了2002.
69、72操作:print栈顶元素的值,结果输出2002
75-iload_4操作:将局部变量表中位置为4的元素(即1002)压入栈顶。
52、55操作:print栈顶元素的值,结果输出1002
标签:12,java,++,元素,栈顶,表中,println,操作,iload 来源: https://blog.csdn.net/weixin_43392489/article/details/100024668