黑马程序员技术交流社区

标题: a++问题 [打印本页]

作者: 1208124957    时间: 2016-7-21 17:55
标题: a++问题
int a = 5;
a = a++;
System.out.println("a = "+a);

为什么结果会是5
作者: 觅离    时间: 2016-7-21 18:32
java会自定义一个临时变量存储a的值,然后判断是先自加还是后自加,因为这里是后自加,所以用临时变量里的a的值进行运算后,才自加,结果打印出来的是5
作者: cat73    时间: 2016-7-21 18:52
本帖最后由 cat73 于 2016-7-21 19:01 编辑

将你的代码编译后,用 javap 反编译可以看到如下代码:
  1. // int a = 5;
  2. 0: iconst_5              定义一个数字 5 并压入栈顶
  3. 1: istore_1              将栈顶的 int 保存到第一个局部变量中

  4. // a = a++;
  5. 2: iload_1               取出第一个局部变量将其值压入栈顶
  6. 3: iinc          1, 1    将第一个局部变量的值加 1
  7. 6: istore_1              将栈顶的 int 保存到第一个局部变量中

  8. // return(隐含的)
  9. 7: return
复制代码

所以就如你看到的,a = a++ 会先把 a 的值压入栈顶,然后把 a + 1,然后把刚刚压入栈顶的值取出来再给 a,所以,a 在这个操作后值并没有变化。

大概就像这个样子,可以看到 iload_1 的时候把 a 的值,也就是 5 压入了栈中
然后 iinc 命令将 a 的值加了 1,也就是变成了 6。
最后 istore_1 将栈顶的 5 又取出来给了 a。


作者: 1208124957    时间: 2016-7-21 19:28
觅离 发表于 2016-7-21 18:32
java会自定义一个临时变量存储a的值,然后判断是先自加还是后自加,因为这里是后自加,所以用临时变量里的a ...

虽然不是很详细  谢了
作者: 1208124957    时间: 2016-7-21 19:30
cat73 发表于 2016-7-21 18:52
将你的代码编译后,用 javap 反编译可以看到如下代码:

所以就如你看到的,a = a++ 会先把 a 的值压入栈顶 ...

懂了   谢了哈
作者: cat73    时间: 2016-7-21 19:47
1208124957 发表于 2016-7-21 19:30
懂了   谢了哈

a++ 这种形式是怎么讲的呢?
先取值,然后加
也就是说:
先取值:iload_1 把 5 取出来存到了栈里面
然后加:iinc 将 a 的值加 1
最后:istore_1 将 a++ 的结果,也就是第一步取的值 5 作为结果,赋值给了 a 这个变量。
作者: 1208124957    时间: 2016-7-22 23:10
cat73 发表于 2016-7-21 19:47
a++ 这种形式是怎么讲的呢?
先取值,然后加
也就是说:

那 int a =5; int b = a++ + ++a;   输出结果是多少    是几加几


顺便问一问   有就业班的课表吗
作者: cat73    时间: 2016-7-22 23:24
1208124957 发表于 2016-7-22 23:10
那 int a =5; int b = a++ + ++a;   输出结果是多少    是几加几

首先我不建议在实际开发中写这种代码,这种代码也就面试中可能出现了。
然后如果你会用 javap,你就可以很轻松的自己找到答案。
当然,这些应该在基础课程里就有。。所以大概不需要用 javap 这么麻烦。。
作者: 谢哥哥    时间: 2016-7-22 23:35
先取值:iload_1 把 5 取出来存到了栈里面,然后加:iinc 将 a 的值加 1
最后:istore_1 将 a++ 的结果,也就是第一步取的值 5 作为结果,赋值给了 a 这个变量。
作者: 15105106710    时间: 2016-7-26 00:25
1208124957 发表于 2016-7-22 23:10
那 int a =5; int b = a++ + ++a;   输出结果是多少    是几加几

应该是5+7吧




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2