1、从字节码角度分析count++
// 先看下count++的代码
public class TestCount{
public static void main(String[] args) {
int count = 0;
int result = count++;
System.out.println(result); // result = 0
}
}
再来看看count++的相关字节码,如下:
public class com.pt.test.TestCount {
public com.pt.test.TestCount();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0 // 将int常量0压入操作数栈
1: istore_1 // 将操作数栈顶元素弹出写入到本地变量表索引为1的位置
2: iload_1 // 又将本地变量表索引为1的数值压入操作数栈
3: iinc 1, 1 // 注意:是将位于本地变量表的count进行了一个自增操作
6: istore_2 // 将操作数栈栈顶元素弹出,写入到索引为2的位置,(也就是说result=0)
7: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_2 // 再将本地变量表索引为2的数值压入操作数栈
11: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
14: return
}
通过上面count++的相关字节码分析可以看到,result = count++是一个先将常量count=0压栈,然后将栈顶元素弹出写入到本地变量,然后又将本地变量的数值压栈,然后本地变量自增1,再将栈顶元素弹出写到本地变量result内。而此时result还是为0;
2、从字节码角度分析++count:
// 先看下++count的代码
public class TestCount{
public static void main(String[] args) {
int count = 0;
int result = ++count;
System.out.println(result); // result = 1
}
}
再来看下++count的相关字节码,如下:
public class com.pt.test.TestCount {
public com.pt.test.TestCount();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0 //将int常量0压入操作数栈
1: istore_1 //将操作数栈顶元素弹出写入到本地变量表索引为1的位置
2: iinc 1, 1 // 注意:将位于本地变量表的count进行了一个自增操作
5: iload_1 //将本地变量表索引为1的数值压入操作数栈,即count自增以后的值入栈
6: istore_2 // 将操作数栈栈顶元素弹出,写入到索引为2的位置,(也就是说result=0)
7: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_2 //再将本地变量表索引为2的数值压入操作数栈
11: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
14: return
}
通过上面++count的相关字节码分析可以看到,result = ++count也是一个先将常量count=0压栈,然后将栈顶元素弹出写入到本地变量,然后本地变量自增1,然后又将本地变量的数值压栈,再将栈顶元素弹出写到本地变量result内。而此时result=1;
最后看下count++&++count的不同点:
count++是一个先将本地变量count=0压栈,然后本地变量自增1,再将栈顶元素弹出写到本地变量result内。result=0;
即首先将count的值存储在一个临时变量区,然后对count进行自增1,最后返回临时变量区的值。
而++count是先将本地变量count自增1,然后再压栈,最后将栈顶元素弹出写到本地变量result内。此时result=1;
更多学习:
字节码角度分析count++ & ++ count:
https://blog.csdn.net/f191501223/article/details/86754780
JVM字节码指令学习: