A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 1208124957 高级黑马   /  2016-7-21 17:55  /  1063 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

int a = 5;
a = a++;
System.out.println("a = "+a);

为什么结果会是5

9 个回复

正序浏览
1208124957 发表于 2016-7-22 23:10
那 int a =5; int b = a++ + ++a;   输出结果是多少    是几加几

应该是5+7吧
回复 使用道具 举报
先取值:iload_1 把 5 取出来存到了栈里面,然后加:iinc 将 a 的值加 1
最后:istore_1 将 a++ 的结果,也就是第一步取的值 5 作为结果,赋值给了 a 这个变量。
回复 使用道具 举报
cat73 黑马帝 2016-7-22 23:24:11
8#
1208124957 发表于 2016-7-22 23:10
那 int a =5; int b = a++ + ++a;   输出结果是多少    是几加几

首先我不建议在实际开发中写这种代码,这种代码也就面试中可能出现了。
然后如果你会用 javap,你就可以很轻松的自己找到答案。
当然,这些应该在基础课程里就有。。所以大概不需要用 javap 这么麻烦。。
回复 使用道具 举报
cat73 发表于 2016-7-21 19:47
a++ 这种形式是怎么讲的呢?
先取值,然后加
也就是说:

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


顺便问一问   有就业班的课表吗
回复 使用道具 举报
cat73 黑马帝 2016-7-21 19:47:03
地板

a++ 这种形式是怎么讲的呢?
先取值,然后加
也就是说:
先取值:iload_1 把 5 取出来存到了栈里面
然后加:iinc 将 a 的值加 1
最后:istore_1 将 a++ 的结果,也就是第一步取的值 5 作为结果,赋值给了 a 这个变量。
回复 使用道具 举报
cat73 发表于 2016-7-21 18:52
将你的代码编译后,用 javap 反编译可以看到如下代码:

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

懂了   谢了哈
回复 使用道具 举报
觅离 发表于 2016-7-21 18:32
java会自定义一个临时变量存储a的值,然后判断是先自加还是后自加,因为这里是后自加,所以用临时变量里的a ...

虽然不是很详细  谢了
回复 使用道具 举报
cat73 黑马帝 2016-7-21 18:52:37
藤椅
本帖最后由 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。

回复 使用道具 举报
java会自定义一个临时变量存储a的值,然后判断是先自加还是后自加,因为这里是后自加,所以用临时变量里的a的值进行运算后,才自加,结果打印出来的是5
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马