前言:i++和++i的区别是什么?大家伙肯定会想到答案: i++先赋值再运算;++i是先运算再赋值;这个问题也算是比较基础的问题了,一般笔试也比较喜欢问。那到底是怎样执行的呢?
先看下代码:
int i = 0;
System.out.println(i++);
int k = 0;
System.out.println(++k);
输出结果分别是0和1。得出结论是:
i++先赋值再运算;++i是先运算再赋值
结果大伙都知道,那怎样去理解呢?
我们先看下i++反编译下的代码逻辑:
public static void main(java.lang.String[]);
Code:
0: iconst_0 //将int类型常量0压入栈
1: istore_1 //将int类型值存入局部变量1
2: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
5: iload_1 //从局部变量1中装载int类型值
6: iinc 1, 1 //**这里是直接在局部变量表中进行相加操作**
9: invokevirtual #22 // Method java/io/PrintStream.println:(I)V
12: return
这里要引入之前讲内存结构是栈桢里的局部变量表和操作数栈,如下图:
接下来我们看下++i的逻辑代码:
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
5: iinc 1, 1
8: iload_1
9: invokevirtual #22 // Method java/io/PrintStream.println:(I)V
12: return
流程图大概是这样:
总结:阿雷觉得最坑的就是iinc这一指令操作码,我理解的是iinc是直接对局部变量值进行操作的,所以他跟iload的执行顺序就直接影响到了结果的输出。nice。