热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

本人使用java3年,也算是个程序小鸟,但是总喜欢把问题研究的透彻。原题是这么个样子:inta2,b5;aba

本人使用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赋值。

也就是说,

a,b在整个计算过程中,只进行了最后那一次的赋值运算

。但是这个说法遭来了同事的反驳。

因此,我在这里发帖询问,

想彻底弄清楚,这么个表达式的整个运算过程。

如果能顺便提到编译器如何实现这样操作那就更好不过了,还望知道详情的大神不吝赐教,小弟在此叩拜

如果实在是腾不出时间解答这无聊的问题,给点参考资料也许,哪怕给几个搜索关键字(我都不知道该对这样的问题怎么搜索)

采纳的答案

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)



推荐阅读
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • Java8 Stream流Intermediate中间操作详细解析 ... [详细]
  • 1、完成图标功能要实现图标功能,首先是后端建表建dict表DROPTABLEIFEXISTSdict;CREATETABLEdict(namevarchar(2 ... [详细]
  • 安卓编年史(4):Android
    安卓0.9显示着横屏的主屏幕——后续一些版本无法实现的一个特性[RonAmadeo供图]尽管从功能上很难将模拟器和操作系统区分开,但安卓0.9是第一个支持横屏显示的版本。更让人惊讶 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
author-avatar
多米音乐_34138178
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有