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。
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 【面试】i++与++i的区别
发表评论 取消回复