Home > Archives > JVM 循环自增

JVM 循环自增

Publish:

1
2
3
4
5
6
7
8
9
10
11
public class Test {
    public static void main(String[] args) {
        int i = 0;
        int x = 0;
        while(i<3) {
            x = x++;
            i++;
        }
        System.out.println("x = " + x);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home\bin\javap -v Test
Classfile /Users/baoguo/codes/demo/target/classes/Test.class
  Last modified Mar 26, 2022; size 843 bytes
  MD5 checksum 59d521a87a420090e23f60ab567f2326
  Compiled from "Test.java"
public class Test
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #11.#30        // java/lang/Object."<init>":()V
   #2 = Fieldref           #31.#32        // java/lang/System.out:Ljava/io/PrintStream;
   #3 = Class              #33            // java/lang/StringBuilder
   #4 = Methodref          #3.#30         // java/lang/StringBuilder."<init>":()V
   #5 = String             #34            // x =
   #6 = Methodref          #3.#35         // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   #7 = Methodref          #3.#36         // java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
   #8 = Methodref          #3.#37         // java/lang/StringBuilder.toString:()Ljava/lang/String;
   #9 = Methodref          #38.#39        // java/io/PrintStream.println:(Ljava/lang/String;)V
  #10 = Class              #40            // Test
  #11 = Class              #41            // java/lang/Object
  #12 = Utf8               <init>
  #13 = Utf8               ()V
  #14 = Utf8               Code
  #15 = Utf8               LineNumberTable
  #16 = Utf8               LocalVariableTable
  #17 = Utf8               this
  #18 = Utf8               LTest;
  #19 = Utf8               main
  #20 = Utf8               ([Ljava/lang/String;)V
  #21 = Utf8               args
  #22 = Utf8               [Ljava/lang/String;
  #23 = Utf8               i
  #24 = Utf8               I
  #25 = Utf8               x
  #26 = Utf8               StackMapTable
  #27 = Utf8               MethodParameters
  #28 = Utf8               SourceFile
  #29 = Utf8               Test.java
  #30 = NameAndType        #12:#13        // "<init>":()V
  #31 = Class              #42            // java/lang/System
  #32 = NameAndType        #43:#44        // out:Ljava/io/PrintStream;
  #33 = Utf8               java/lang/StringBuilder
  #34 = Utf8               x =
  #35 = NameAndType        #45:#46        // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  #36 = NameAndType        #45:#47        // append:(I)Ljava/lang/StringBuilder;
  #37 = NameAndType        #48:#49        // toString:()Ljava/lang/String;
  #38 = Class              #50            // java/io/PrintStream
  #39 = NameAndType        #51:#52        // println:(Ljava/lang/String;)V
  #40 = Utf8               Test
  #41 = Utf8               java/lang/Object
  #42 = Utf8               java/lang/System
  #43 = Utf8               out
  #44 = Utf8               Ljava/io/PrintStream;
  #45 = Utf8               append
  #46 = Utf8               (Ljava/lang/String;)Ljava/lang/StringBuilder;
  #47 = Utf8               (I)Ljava/lang/StringBuilder;
  #48 = Utf8               toString
  #49 = Utf8               ()Ljava/lang/String;
  #50 = Utf8               java/io/PrintStream
  #51 = Utf8               println
  #52 = Utf8               (Ljava/lang/String;)V
{
  public Test();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 1: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   LTest;

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=3, args_size=1
         0: iconst_0
         1: istore_1
         2: iconst_0
         3: istore_2
         4: iload_1
         5: iconst_3
         6: if_icmpge     20
         9: iload_2
        10: iinc          2, 1
        13: istore_2  //把上面iinc自增的值给覆盖掉了。
        14: iinc          1, 1
        17: goto          4
        20: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
        23: new           #3                  // class java/lang/StringBuilder
        26: dup
        27: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
        30: ldc           #5                  // String x =
        32: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        35: iload_2
        36: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
        39: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        42: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        45: return
      LineNumberTable:
        line 3: 0
        line 4: 2
        line 5: 4
        line 6: 9
        line 7: 14
        line 9: 20
        line 10: 45
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      46     0  args   [Ljava/lang/String;
            2      44     1     i   I
            4      42     2     x   I
      StackMapTable: number_of_entries = 2
        frame_type = 253 /* append */
          offset_delta = 4
          locals = [ int, int ]
        frame_type = 15 /* same */
    MethodParameters:
      Name                           Flags
      args
}
SourceFile: "Test.java"

Process finished with exit code 0

声明: 本文采用 BY-NC-SA 授权。转载请注明转自: Ding Bao Guo