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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 wawsc5354524 于 2014-8-7 01:32 编辑

class Text
{
     public static void main(String[] args)
{
   int a=10;
  a=a++;
   System.out.println("a");
}
}




请问为什么最后输出是10?而不是11,请详细的解释一下步骤,小弟新手

点评

看这里的讨论http://bbs.itheima.com/thread-135787-1-1.html  发表于 2014-8-7 02:12

15 个回复

倒序浏览
a++先给值再加1,++a先加1再给值
回复 使用道具 举报
遇到问题要先在心里默念“不复杂不复杂不复杂”心态好就好解决了。
你看,一个赋值语句,把 10 赋给 a ,赋完值 a 就是 10 了
回复 使用道具 举报
cheye0207 发表于 2014-8-7 01:28
a++先给值再加1,++a先加1再给值

那最后又++了啊,为什么a的值没有变?
回复 使用道具 举报
icris 发表于 2014-8-7 01:28
遇到问题要先在心里默念“不复杂不复杂不复杂”心态好就好解决了。
你看,一个赋值语句,把 10 赋给 a ,赋 ...

可是最后又++了啊,那个a值跑哪里去了、?
回复 使用道具 举报
x=a++;
a=x;
楼主的语句也可以这么写吧
回复 使用道具 举报
cheye0207 发表于 2014-8-7 01:32
x=a++;
a=x;
楼主的语句也可以这么写吧

这是一个孩子提出来的问题,感觉有点奇怪,所以就拿上问问大家
回复 使用道具 举报
wawsc5354524 发表于 2014-8-7 01:32
可是最后又++了啊,那个a值跑哪里去了、?

一个赋值语句,赋值操作一定是最后执行的(吧)
所以应该是先得到结果 10 再 a++ 再把 10 赋给 a
回复 使用道具 举报
1、int a=0;a=a++;
生成的字节码是:
0 iconst_0 -----0压入栈顶
1 istore_1 [a] -----栈顶值(0)存入局部变量1(a)
2 iload_1 [a] -----变量1的值压入栈顶(值为0)(a++效果)
3 iinc 1 1 [a] -----变量1自加(a++操作,自加后变量1的值为1)
6 istore_1 [a] -----将栈顶值(0)存入变量1(=操作)
a的值依次变化为:0->1->0

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 讲的不错,怕是新手难以理解

查看全部评分

回复 使用道具 举报
我感觉这段代码的运行是这样的,a++,此时a的值为10,将其传出去,然后++,a=11,最后把10赋给a,结果a又从11变成了10.
回复 使用道具 举报
本帖最后由 Bermuda  于 2014-8-7 07:49 编辑

int a=10;
a=a++;
其实是两个步骤:
赋值:a把10赋给了a,
加一:a+1
***加完了a就是11了,执行下面的语句

如果是
a=++a;
两个步骤:
加一:a+1
赋值:把(a+1)的值赋给a

像是for循环,你可以试试,a++跟++a循环次数是不一样的
for(int a=1;a<=5;a++)
//一共循环5次

for(int a=1;a<=5;++a)
//循环4次,第一次进循环a就等于2了,然后在执行for里的操作

***就把它看成两个步骤就好了 后加加后加1,前加加先加1

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 未解答出楼主所问问题,但是++的知识点不错.

查看全部评分

回复 使用道具 举报
运行步骤的是这样的:
首先int a = 10,给a赋初值为10
a=a++,由于++运算符在后,所以先加后用,先把10的值重新赋给a,在执行++操作,由于=运算符已运行不再作用,故a的值为10,并未重新赋值!

想看到不一样的结果,把赋值运算去掉即可,不管a++还是++a;最后打印结果都为11.
回复 使用道具 举报
前来学习的
回复 使用道具 举报
表达式a=a++的运算过程是先将a的指赋予a!即先运行a=a,再自动加1,这里加1只是作为返回值出现,并没有赋给a!
回复 使用道具 举报
lcl 中级黑马 2014-8-7 09:36:09
15#
自增运算符在后面就是先执行运算,运算完再自增;a=a++    a先执行赋值运算,把10赋给左边a,然后变成11,但是输出的是接收赋值的a,不是自增后的a,所以是10
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马