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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 HM李超 于 2013-8-18 23:49 编辑

       我们知道Java中支持符合运算符,现在以“+=”这个运算作示例,设有两个变量a,b。
       一般情况下,我认为a+=b这个表达式,相当于a=a+b和a=b+a;看起来并没有什么区别,大部分情况下,运算结果一致。
看看下面的示例程序,其结果就不一样了
  1. class  Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int a = 1;
  6.                 a+=a++;
  7.                 System.out.println(a);  //输出:2
  8.         }
  9. }
复制代码
上面的代码按照以前的理解可以拆解成a=a+a++和a=a++ +a这两种形式,第一种形式运算结果为2,第二种运行结果为3;
由此可以理解成Java中的a+=b表达式只能等同于a=a+b,而绝不等于a=b+a,这样理解,对吗?有知道的人能给我具体解释吗?最好给个内存图理解理解!

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1 奇思妙想

查看全部评分

5 个回复

倒序浏览
int a = 1;
a+ = a++;// 等价于a = a + (a++);这个运算式的结果为2,因为a++是先赋值后自增的,而这个等式是获取的a自增之前的结果,因为a自增后没有再次参与运算。
a = (a++) + a;// 这个等式中,a在自增以后又参与了运算,所以结果为3。
回复 使用道具 举报
楼主说的是正确的,这点我们老师也用这个例子证明过。
回复 使用道具 举报
楼主的说法不正确,a=a+a++相当于a是一个变量值,返回值时,返回的是a的值,而a=a++ +a中变量值相当于a++,返回值时返回的是a++,就等于多加了个a,
回复 使用道具 举报
其实  a = a+ (a++)  //其中 a =1 ,a++ = 1 , a =2;
      
         a = (a++)+ a //其中 a++ = 1 ,a = 2, a =3;

和你一起进步!{:soso_e141:}
回复 使用道具 举报
本帖最后由 张晓辉 于 2013-8-18 23:20 编辑

a+=b  等于a=a+b  同楼主  不能等同于a=b+a,
至于自增,如下
a=1
(1) a = a + (a++); //a在自增前要跟前面的进行运算,运算结果为2,a=2,然后a自增
(2) a = (a++) + a; //这个理解为a自增的前面没有运算,自增了以后才进行了运算,此时+a的a已经自增为2,故1+2=3,结果a=3
(3) a += (a++);  //这个就是a = a + (a++)等同于(1)结果为2
(4) a += (a++) + (++a); //a=a+(a++)+(++a)先进行a+(a++)运算,结果为2,此时a已经自加,所以a的值为2,所以+(++a)是a再次先自加再与前面进行运算,就是3加上前面的运算结果2就是5,结果为5.
      总之,运算过程中是有顺序的,从左到右在a++之前的运算a的值都没变,如果a++后面又有了运算,之后的a会变成自增后的结果参与运算,例如b=2 ,b+=b+(b++)*b 可写成b=b+b+(b++)*b, 10=2+2+(2)*3

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马