为了账号安全,请及时绑定邮箱和手机立即绑定

连续赋值问题

连续赋值问题

慕UI6326445 2018-04-01 23:22:31
a=3; a+=a*=a; 为什么a=12?虽然我知道是算术运算符的优先级高于赋值运算符,但对于具体运算过程不理解,请大神解答下,谢谢。
查看完整描述

4 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

a += a *= a;  这里并不是几个“算数运算符”和“赋值运算符”,而是两个“复合赋值运算符”:+=*=。 它们的运算顺序是从左到右。

复合赋值运算符运算时会先对左侧操作数求值并记住这个值,然后再对右侧求值,最后再执行赋值。

那么这个表达式中 += 运算符先运算:

  1. 先求 a += a* = a(我用粗体标出来),记下这个 a 的值为 3

  2. 再求右侧操作数 a += a* = a 的值,它是个 *= 表达式

  3. 仍然是求复合赋值运算符左侧的 a += a *= a,会记下这时 a 的值还是 3

  4. 再求右侧操作数 a += a *= a,这个 a 是 3,随后执行复合赋值,*= 表达式的值为 9,这个 9 就是第 2 步中要计算的 *= 表达式的值

  5. 执行复合赋值 +=。虽然你觉得这时 a 的值应该是 9,但是复合赋值运算时会用之前记下的左操作数的值(也就是第 1 步中记下的 3)

  6. 所以最终 a = 3 + 9

查看完整回答
3 反对 回复 2018-04-02
?
头疼万分

TA贡献2条经验 获得超1个赞

根据java运算符的优先级,和数学一样,先乘除后加减,所以a+=a*=a。就先算a*=a=a*a=9,a+=9=12

查看完整回答
反对 回复 2018-04-02
?
CodeManDSH

TA贡献58条经验 获得超18个赞

个人理解:

    a += a * = a;

因为:a += a    等于    a = a + a;

           a *= a    等于    a = a * a;

所以

    a = a + ( a * a ) ;代入3 得12。

查看完整回答
反对 回复 2018-04-02
?
对象不是老婆

TA贡献16条经验 获得超6个赞


赋值运算符和复合赋值运算符是从右边开始的,计算顺序为:

a * a → a 先算最右的赋值给a.
a + a → a 再算剩下右面的赋值给a.

如果是a*=a+=a;结果就是18.

查看完整回答
反对 回复 2018-04-02
  • 慕工程5315762
    慕工程5315762
    不是先算最右边的,还是从左到右依次计算,但要考虑优先级问题,你这里就不用考虑了,a*=a+=a;先计算a*=a,然后赋值3*3得9给a,最后计算a+=a(此时a值为9),9+9=18;
  • 4 回答
  • 2 关注
  • 2013 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信