有趣的面试题 int a = 0; a = a++;

ゝ一纸荒年。 2024-04-19 12:39 176阅读 0赞

觉得这题挺有趣的,所以还是可以写一篇文章来说说

  1. public class Main {
  2. public static void main(String[] args) {
  3. int i = 0;
  4. i = i++;
  5. System.out.println(i);
  6. }
  7. }

这段代码的执行结果是什么呢?
大多数人都觉得是 1,确实以我们的理解,单从源码来看不管怎么理解都应该是1
所以这次我们看看jvm指令,看看到底是怎么一回事
在这里插入图片描述

这是反编译后的jvm指令,我们只要关注红框那一部门就行了,LINENUMBER 这个可以忽略,它表示第多少行

  1. ICONST_0 //把0放入到操作数栈
  2. ISTORE 1 //把栈顶的那个值放入到局部变量表的索引为1的那个位置中 此时就是 int i = 0; 这两个指令执行完后 i 就等于 0 了,有值了
  3. ILOAD 1 把局部变量表中索引为1的值放到操作数栈顶
  4. IINC 1 1 对局部变量表中索引为1的值进行 + 1 此时局部表量表中的 i = 1
  5. ISTORE 1 把栈顶的值赋值给局部变量表中索引为1的位置,此时 i = 0

从上面分析看来,原来是栈顶的 0 把 1 给覆盖了,也就是类似于

  1. int i = 0; //定义i = 0
  2. int temp = i; //把i 放入到临时变量中
  3. i = i + 1; //对i 进行 + 1
  4. i = temp; //然后又覆盖掉了 i 的值

如果把代码改成

  1. int i = 0;
  2. i = ++i;
  3. System.out.println(i);

此时i就是等于1了

在这里插入图片描述

看看什么发生了变化
先进行 + 1 然后再把 + 1后的值放入栈顶,之后再赋值给 i

类似于下面这段代码

  1. int i = 0;
  2. i = i + 1;
  3. int temp = i;
  4. i = temp;

发表评论

表情:
评论列表 (有 0 条评论,176人围观)

还没有评论,来说两句吧...

相关阅读

    相关 int *p=aint *p=&a区别

      指针变量用来存放指针(或者可以理解成地址)。而 & 则是取地址运算符,因此给指针变量赋值的方式一般是把变量的地址取出来,然后付给对应类型的指针变量: int a;