大家好,我是【八戒,你又涨价了哎】
以下是我个人在学习过程中的分享,请大家多多指教
一、问题提出
我们知道, java中自增运算符++或--,运算符在变量之前,先自增或减,再赋值。运算符在变量之后,先赋值,再自增或减
那么下面这段代码的结果是什么?
int i = 1;
i = i++;
System.out.println(i);
答案是 1
为什么呢?
二、分析以及结论
1、首先从JVM层面分析
通过javap -c 来查看其对应的 JVM 字节码得到
分析
0: iconst_1 // 将常量1推送到操作数栈中
1: istore_1 // 将栈顶的值存储到局部变量i
2: iload_1 // 将局部变量i的值加载到操作数栈中
3: iinc 1, 1 // 对局部变量i自增1
6: istore_1 // 将栈顶的值(自增之前的值)存储回局部变量i
7: getstatic // 获取静态字段System.out
10: iload_1 // 将局部变量i加载到操作数栈中
11: invokevirtual // 调用println方法输出i的值
通俗解释来说,就是JVM会使用一个临时变量来接收 i 的值,然后进行自增运算
2、从代码的执行步骤层面分析
i++
是后置自增操作符,意思是先使用变量i
的当前值,然后再将i
自增 1- 在执行
i = i++
时,以下步骤会依次发生:- 首先,表达式右边的
i++
的当前值(此时i = 1
)被存储。 - 然后
i
自增 1,此时i
实际变成2
- 接下来,
=
赋值操作会把之前存储的1
重新赋值给i
,覆盖掉自增后的2
- 首先,表达式右边的
因此,虽然 i
自增了,但赋值操作最终将 i
重新赋值为自增前的值,即 1