java ++i、i++、i++ + ++i、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

发布了477 篇原创文章 · 获赞 588 · 访问量 267万+

猜你喜欢

转载自blog.csdn.net/qq_15037231/article/details/90732755
i++
今日推荐