谢红波 2012-09-13 21:02
浏览 328
已采纳

请教 java中 a+=b+=a+=b 的详细运算过程

本人使用java3年,也算是个程序小鸟,但是总喜欢把问题研究的透彻。
原题是这么个样子:
int a = 2,b = 5;
a+=b+=a+=b;
问最后a,b分别是多少。

我原本以为整个过程是这样的
0.原式清晰化的表达一下: a+=(b+=(a+=b));
1.先算最里面的括号 a+=b //a = 7;
2.再算中间括号 b+=a //b = 12;
3.计算最后括号 a+=b //a = 19

但是实际结果出乎我的意料,答案是a=14 b=12

后来我想了一下,出现这样的原因是因为第一次计算最里面的括号并没有给a赋值。
也就是说,[color=red]a,b在整个计算过程中,只进行了最后那一次的赋值运算[/color]。但是这个说法遭来了同事的反驳。

因此,我在这里发帖询问,[color=blue]想彻底弄清楚,这么个表达式的整个运算过程。
如果能顺便提到编译器如何实现这样操作那就更好不过了,还望知道详情的大神不吝赐教,小弟在此叩拜[/color]
如果实在是腾不出时间解答这无聊的问题,给点参考资料也许,哪怕给几个搜索关键字(我都不知道该对这样的问题怎么搜索)

  • 写回答

7条回答 默认 最新

  • jinnianshilongnian 2012-09-13 21:19
    关注

    a+=b+=a+=b;
    等价于
    a=a+(b=b+(a=a+b));

    1、运算过程中注意a是原子类型 值是拷贝的
    2、a=a+(××××); //+结合率是从左到右。 即先将a压栈 然后计算括号内的,这样算就明白了,具体请看用javap -verbose 来观看字节码操作
    0: iconst_2

    1: istore_1 --->a
    2: iconst_5
    3: istore_2 --->b
    4: iload_1 载入a(2)
    5: iload_2 载入b(5)
    6: iload_1 载入a(2)
    7: iload_2 载入b(5)
    8: iadd 7 (第6和7行累计 结果压栈)
    9: dup 复制栈顶
    10: istore_1 a(7) 把栈顶结果保存到a
    11: iadd 12 (栈顶7+第5行)
    12: dup 复制12
    13: istore_2 b(12) 结果保存到b
    14: iadd 12+2(栈顶+第4行)
    15: istore_1 a(14)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常
  • ¥15 关于风控系统,如何去选择