目录
-
-
-
-
- [1. 情况1](#1. 情况1)
-
- [1.1 i++](#1.1 i++)
- [1.2 ++i](#1.2 ++i)
- [2. 情况2](#2. 情况2)
- [3. 情况3](#3. 情况3)
- [4. 情况4](#4. 情况4)
-
-
-
1. 情况1
1.1 i++
-
1.代码块
public void test(){
int i = 10;
i++;
System.out.println(i);
} -
2.字节码
0 bipush 10
2 istore_1
3 iinc 1 by 1
6 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
9 iload_1
10 invokevirtual #3 <java/io/PrintStream.println : (I)V>
13 return
1.2 ++i
-
1.代码块
public void test(){
int i = 10;
++i;
System.out.println(i);
} -
2.字节码
0 bipush 10
2 istore_1
3 iinc 1 by 1
6 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
9 iload_1
10 invokevirtual #3 <java/io/PrintStream.println : (I)V>
13 return -
3.该情况下,i++与++i没有区别,均是在原有的基础自增1,然后输出
2. 情况2
-
1.代码块
public void test(){
int i = 10;
i = i++;
System.out.println(i);
} -
2.字节码
0 bipush 10
2 istore_1
3 iload_1
4 iinc 1 by 1
7 istore_1
8 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
11 iload_1
12 invokevirtual #3 <java/io/PrintStream.println : (I)V>
15 return -
3.分析
1.当int取值-128~127 时,JVM采用bipush 指令将常量压入栈中。
2.bipush 10将10放入操作数栈里。
3.istore_1 将操作数栈顶10取出来放入局部变量表角标为1的位置。
4.单元测试方法局部变量表角标为0的位置放的是this。
5.iload_1 将局部变量表角标为1的数放到操作数栈中。
6.iinc 1 by 1 给局部变量表索引为1的位置自增长1,
局部变量表索引为1的位置当前是10,自增后为11。
7.istore_1 将操作数栈顶元素10放入局部变量表索引为1的位置。
8.iload_1 将局部变量表角标为1的数拿出来打印即10。
3. 情况3
-
1.代码块
public void test(){
int i = 10;
i *= i++;
System.out.println(i);
} -
2.字节码
0 bipush 10
2 istore_1
3 iload_1
4 iload_1
5 iinc 1 by 1
8 imul
9 istore_1
10 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
13 iload_1
14 invokevirtual #3 <java/io/PrintStream.println : (I)V>
17 return -
3.分析
1.bipush 将10压入操作数栈。
2.istore_1 操作数栈顶元素弹出,放入局部变量表索引为1的位置。
3.iload_1 取局部变量表索引为1的数10,放入操作数栈顶。
4.iload_1 取局部变量表索引为1的数10,放入操作数栈顶。
5.iinc 1 by 1 给局部变量表索引为1的数自增1,即11。
6.imul 从操作数栈中弹出两个int值,将它们相乘,并将结果100推回操作数栈顶。
7.将操作数栈顶100弹出,放入局部变量表索引为1的位置。
8.将局部变量表索引为1位置上的数100放入操作数栈顶用于打印,即100。
4. 情况4
-
1.代码块
public static void test(){
int i = 10;
i = i + (i++) + (++i);
System.out.println(i);
} -
2.字节码
0 bipush 10
2 istore_1
3 iload_1
4 iload_1
5 iinc 1 by 1
8 iadd
9 iinc 1 by 1
12 iload_1
13 iadd
14 istore_1
15 getstatic #5 <java/lang/System.out : Ljava/io/PrintStream;>
18 iload_1
19 invokevirtual #6 <java/io/PrintStream.println : (I)V>
22 return -
3.分析
1.bipush 10 将10压入操作数栈顶。
2.istore_1 将操作数栈顶元素弹出,存到局部变量表索引为1的位置。
3.iload_1 将局部变量表索引为1的元素压入操作数栈顶。
4.iload_1 将局部变量表索引为1的元素压入操作数栈顶。
5.iinc 1 by 1 将局部变量表索引为1的元素自增加1,即11。
6.iadd 从操作数栈中弹出两个int值,将它们相加,并将结果20推回操作数栈顶。
7.iinc 1 by 1 将局部变量表索引为1的元素自增加1,即12。
8.iload_1 将局部变量表索引为1的元素压入操作数栈顶,即12。
9.iadd 从操作数栈中弹出两个int值,即12和20,将它们相加,
并将结果32推回操作数栈顶。
10.istore_1 将操作数栈顶元素32弹出,存到局部变量表索引为1的位置。
11.iload_1 将局部变量表索引为1的元素32存到操作数栈打印。即32。