当前位置: 首页 > article >正文

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

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;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=4, locals=2, args_size=1
         0: iconst_2
         1: istore_1
         2: iload_1
         3: iload_1
         4: iload_1
         5: iload_1
         6: imul
         7: isub
         8: dup
         9: istore_1
        10: iadd
        11: istore_1
        12: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
        15: new           #3                  // class java/lang/StringBuilder
        18: dup
        19: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
        22: ldc           #5                  // String a=
        24: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        27: iload_1
        28: 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;)V
        37: return
      LineNumberTable:
        line 5: 0
        line 6: 2
        line 7: 12
        line 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.kler.cn/a/534609.html

相关文章:

  • 本地化部署 AI 的第一步,认识和使用 ollama
  • 在VS Code中基于TypeScript使用Vue.js搭建Babylon.js的开发环境
  • nlp文章相似度
  • 数据结构与算法学习笔记----容斥原理
  • MySQL表的CURD
  • 吴签磁力_简单多功能的磁力搜索工具
  • 国产编辑器EverEdit - 工具栏说明
  • SpringBoot 整合 Mybatis:注解版
  • 深度学习|表示学习|卷积神经网络|NIN 相比普通 CNN|17
  • mysql慢查询工具explain
  • MySQL 的 binlog 作用
  • 11.10 LangChain对话记忆管理实战:从入门到生产级ConversationBufferMemory应用指南
  • 查看设备uuid
  • 【EdgeAI实战】(2)STM32 AI 扩展包的安装与使用
  • 【技术追踪】DiffMIC:用于医学图像分类的双引导扩散网络(MICCAI-2024)
  • 了解linux-5.4.31/drivers/gpio/gpiolib-devres.c中的devm_gpiod_get_optional()函数
  • MD5 简介 以及 C# 和 js 实现【加密知多少系列_1】
  • 新版AndroidStudio 修改 jdk版本
  • 8. k8s二进制集群之Kubectl部署
  • http状态码:504 Gateway Timeout(网关超时)的原有以及排查问题的思路
  • 【Uniapp-Vue3】创建DB schema数据表结构
  • VMware下Linux和macOS遇到的一些问题总结
  • android 自定义通话录音
  • 【PostgreSQL内核学习 —— (WindowAgg(二))】
  • Docker 国内最新可用镜像源20250205
  • Solidity08 Solidity 函数