本帖最后由 cat73 于 2016-7-21 19:01 编辑
将你的代码编译后,用 javap 反编译可以看到如下代码:
- // int a = 5;
- 0: iconst_5 定义一个数字 5 并压入栈顶
- 1: istore_1 将栈顶的 int 保存到第一个局部变量中
- // a = a++;
- 2: iload_1 取出第一个局部变量将其值压入栈顶
- 3: iinc 1, 1 将第一个局部变量的值加 1
- 6: istore_1 将栈顶的 int 保存到第一个局部变量中
- // return(隐含的)
- 7: return
复制代码
所以就如你看到的,a = a++ 会先把 a 的值压入栈顶,然后把 a + 1,然后把刚刚压入栈顶的值取出来再给 a,所以,a 在这个操作后值并没有变化。
大概就像这个样子,可以看到 iload_1 的时候把 a 的值,也就是 5 压入了栈中
然后 iinc 命令将 a 的值加了 1,也就是变成了 6。
最后 istore_1 将栈顶的 5 又取出来给了 a。
|