Java面试:a+=a-=aa原理解析

embedded/2025/2/7 12:02:01/

Java面试:a+=a-=a*a原理解析

a+=a-=a*a属于Java基础中比较难以理解的,面试中也经常会遇到这个问题,本篇博客对此问题进行分享总结。

1.问题代码
	public static void main(String[] args) {int a = 2;a+=a-=a*a;System.out.println("a="+a);}

我第一次遇见这个问题的时候,很不巧的算错了结果还和运行结果一致。在后面梳理思路时发现其中问题,反编译class文件才明白其中原理,感觉是个很有意思的问题。下面给出运行结果
运行结果
到这很多同学开始疑惑了吧,结果为什么不是-4。接下来看看JVM如何运行这段代码的。

 public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=4, locals=2, args_size=10: iconst_21: istore_12: iload_13: iload_14: iload_15: iload_16: imul7: isub8: dup9: istore_110: iadd11: istore_112: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;15: new           #3                  // class java/lang/StringBuilder18: dup19: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V22: ldc           #5                  // String a=24: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;27: iload_128: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;31: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;34: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V37: returnLineNumberTable:line 5: 0line 6: 2line 7: 12line 8: 37
}

这是用javap -verbose反编译的代码。
先看指令号为2、3、4、5完成的事情,这四行指令完成了将运算需要的数据加载到操作数栈中。在这里插入图片描述
指令号6(imul)将栈顶两int型数值相乘并将结果压入栈顶
在这里插入图片描述
指令号7(isub)将栈顶两int型数值相减并将结果压入栈顶
在这里插入图片描述
指令号8(dup)复制栈顶数值并将复制值压入栈顶
在这里插入图片描述
指令号9(istore_1) 将栈顶int型数值存入局部变量表第二个位置,第一个赋值操作出现了。
在这里插入图片描述
关键点出现了,指令号10(iadd)将栈顶两个int值相加操作数栈现在只有-2和2,明显a+=a-=a*a中a+=的a并没有重新去栈中取值,准确的说四个a的值在计算开始时已经全部取出。所以最后相加的时候,用的是刚开始时定义的a的值。
在这里插入图片描述


http://www.ppmy.cn/embedded/160294.html

相关文章

K8s 常见面试题(K8s Common Interview Questions)

K8s 常见面试题 k8s‌是一个开源的容器编排平台&#xff0c;用于管理云平台中多个主机上的容器化应用。Kubernetes的目标是使部署容器化的应用简单且高效&#xff0c;提供了应用部署、规划、更新和维护的一种机制‌。 定义和功能 Kubernetes&#xff08;简称K8s&#xff09;…

【大数据技术】词频统计样例(hadoop+mapreduce+yarn)

词频统计(hadoop+mapreduce+yarn) 搭建完全分布式高可用大数据集群(VMware+CentOS+FinalShell) 搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn) 在阅读本文前,请确保已经阅读过以上两篇文章,成功搭建了Hadoop+MapReduce+Yarn的大数据集群环境。 写在前面 Wo…

【lua编程实操(一)】函数和闭包

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:lua从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多lua语言的知识   &#x1f51d;&#x1f51d; lua编程实操 1. 函数的类值2. …

Axure设计元件库分享——SpringUI Web端动态交互元件库

在快节奏的Web设计与开发领域&#xff0c;设计师们总是在寻找那些能够助力他们快速构建出功能丰富且界面美观原型的工具。SpringUI&#xff0c;一个专为Web设计与开发领域打造的高质量、全面且易于使用的交互元件集合&#xff0c;正是这样一个能够满足设计师需求的优秀元件库。…

SQL Server的安装和简单使用

目录 一、SQL Server 1.1、简介 1.2、安装包 二、安装SQL Server 2.1、双击安装包 2.2、选择自己想要安装的位置 2.3、点击安装 2.4、安装完成之后会出现以下页面&#xff0c;按照序号依次点击 2.5、不用管密钥&#xff0c;点击下一步 2.6、选择【我接受】 2.7、是否…

【腾讯云】腾讯云docker搭建单机hadoop

这里写目录标题 下载jdk hadoop修改hadoop配置编写Dockerfile构建镜像运行镜像创建客户端 下载jdk hadoop wget --no-check-certificate https://repo.huaweicloud.com/java/jdk/8u151-b12/jdk-8u151-linux-x64.tar.gz wget --no-check-certificate https://repo.huaweicloud.…

2022年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题3)-网络部分解析-附详细代码

目录 附录1:拓扑图 附录2:地址规划表 1.SW1 2.SW2 3.SW3 4.SW4 5.SW5 6.SW6 7.SW7 8.R1 9.R2 10.R3 11.AC1 12.AC2 13.AP2 14.AP3 15.EG1 16.EG2 附录1:拓扑图 附录2:地址规划表 设备

【目标检测】模型验证:K-Fold 交叉验证

K-Fold 交叉验证 1、引言1.1 K 折交叉验证概述 2、配置2.1 数据集2.2 安装包 3、 实战3.1 生成物体检测数据集的特征向量3.2 K 折数据集拆分3.3 保存记录3.4 使用 K 折数据分割训练YOLO 4、总结 1、引言 我们将利用YOLO 检测格式和关键的Python 库&#xff08;如 sklearn、pan…