❤ 面试题

1-第一季-01_尚硅谷_JavaSE面试题:自增变量-2021-03-04 - 图1

1、自测结果(错误!)

i = 1 —> 2 —> 4
j = 3
k = 4 + 3*3 = 13

1.1、自测结果(知道 i 值后的自测)(正确!)

int i = 1 —> 2 —> 1 —> 2 —> 3 —> 4
int j = 1 **(重点**:需要注意 i++ 为用后加,删除-与结果无关!!!)
int k = 2 + 3*3 = 11

2、运行结果

1-第一季-01_尚硅谷_JavaSE面试题:自增变量-2021-03-04 - 图2

一、面试题解析:i = i++

1、 执行过程

  • ① 把 i 的值压入操作数栈
  • ② i 变量自增1(重点:自增1是在局部变量表中进行的!)
  • ③ 把操作数栈中的值赋值给 i(重点:赋值过程为操作数栈的值覆盖局部变量表中的值的过程???!!!)

1-第一季-01_尚硅谷_JavaSE面试题:自增变量-2021-03-04 - 图3

1-第一季-01_尚硅谷_JavaSE面试题:自增变量-2021-03-04 - 图4

1-第一季-01_尚硅谷_JavaSE面试题:自增变量-2021-03-04 - 图5

2、字节码角度分析

1-第一季-01_尚硅谷_JavaSE面试题:自增变量-2021-03-04 - 图6

3、细节说明:i = i++

  • 同时在局部变量表操作数栈中存在 i 。
  • i++ 是在局部变量表中执行的!!!!
  • 赋值操作会使得操作数栈的 i 值,覆盖局部变量表中的 i 值。(关键点:覆盖)
  • 另外注意:i ++ 是用后加

二、面试题解析:int j = i++

1、 执行过程

  • ① 把 i 的值压入操作数栈
  • ② i 变量自增1
  • ③ 把操作数栈中的值赋值给 j

1-第一季-01_尚硅谷_JavaSE面试题:自增变量-2021-03-04 - 图7

1-第一季-01_尚硅谷_JavaSE面试题:自增变量-2021-03-04 - 图8

1-第一季-01_尚硅谷_JavaSE面试题:自增变量-2021-03-04 - 图9

2、字节码角度分析

1-第一季-01_尚硅谷_JavaSE面试题:自增变量-2021-03-04 - 图10

三、面试题解析:int k = i + ++i * i++

1、 执行过程

  • ① 把 i 的值压入操作数栈
  • ② i 变量自增1
  • ③ 把 i 的值压入操作数栈
  • ④ 把 i 的值压入操作数栈
  • ⑤ i 变量自增
  • ⑥ 把操作数栈中前两个弹出求乘积结果再压入栈
  • ⑦ 把操作数栈中的值弹出求和再赋值给 k

1-第一季-01_尚硅谷_JavaSE面试题:自增变量-2021-03-04 - 图11

1-第一季-01_尚硅谷_JavaSE面试题:自增变量-2021-03-04 - 图12

1-第一季-01_尚硅谷_JavaSE面试题:自增变量-2021-03-04 - 图13

1-第一季-01_尚硅谷_JavaSE面试题:自增变量-2021-03-04 - 图14

1-第一季-01_尚硅谷_JavaSE面试题:自增变量-2021-03-04 - 图15

1-第一季-01_尚硅谷_JavaSE面试题:自增变量-2021-03-04 - 图16

1-第一季-01_尚硅谷_JavaSE面试题:自增变量-2021-03-04 - 图17

2、字节码角度分析

1-第一季-01_尚硅谷_JavaSE面试题:自增变量-2021-03-04 - 图18

3、从字节码角度理解“i++ 与 ++i 的区别”

  • 个人理解:iload(压入操作数栈)和 innc(局部变量表中自增)的先后顺序不同。

四、小结

1-第一季-01_尚硅谷_JavaSE面试题:自增变量-2021-03-04 - 图19

五、拓展与思考

1、设 int i = 1,那么 int j = i++ 与 int j = ++i 有区别吗?(重点)

  • 根据小结中“赋值 = 最后计算”,则两者没有区别???(**错误!**)
  • 答案解析:前者是先压栈再自增(结果:1),后者是先自增再压栈(结果:2)

☀ 课堂小测

  • 回答上述面试题。
  • i = i++ 字节码和执行过程?细节说明?
  • int j = i++ 字节码和执行过程?
  • int k = i + ++i * i++ 字节码和执行过程?
  • 自增变量的运算小结?