首页 > 编程语言 >Java千问08:关于Java语言复合赋值运算符的两个问题,快来瞧瞧!

Java千问08:关于Java语言复合赋值运算符的两个问题,快来瞧瞧!

时间:2022-12-28 10:01:12浏览次数:52  
标签:short Java 变量 08 复合 运算符 赋值

​我们知道,在Java以及很多高级编程语言当中,都有一种运算符叫做复合赋值运算符。复合赋值运算符由两个符号组成,它所能完成的运算操作也分为两步:第一步是运算,第二步是赋值。比如说:

Java千问08:关于Java语言复合赋值运算符的两个问题,快来瞧瞧!_赋值运算符

上面的这两条语句相当于

Java千问08:关于Java语言复合赋值运算符的两个问题,快来瞧瞧!_复合赋值运算符_02

但是,如果碰到下面这样的情况,a的值该应该是多少呢?

Java千问08:关于Java语言复合赋值运算符的两个问题,快来瞧瞧!_赋值_03

有人认为应该按以下方式来计算,因为我们都知道,在四则运算规则中,遵循“先乘除,后加减”的原则

Java千问08:关于Java语言复合赋值运算符的两个问题,快来瞧瞧!_Java_04

按照这样的方式来计算,得到a的值应该是7,但实际运行程序所得到的结果是8。这是为什么呢?​

就是因为复合赋值运算符在完成运算的时候,遵循一个规则:把“=”右边当作整体!也就是说,刚才的运算和赋值操作应该被解释为以下形式

Java千问08:关于Java语言复合赋值运算符的两个问题,快来瞧瞧!_复合赋值运算符_05

因此,按照这种方式,“=”右边的“3+1”应该被当作整体,优先进行运算,所以得到的最终计算结果就是变量a的值为8。​

我们再来看另外一个问题,这一次,我们把变量a的类型由原来的int改为short。

Java千问08:关于Java语言复合赋值运算符的两个问题,快来瞧瞧!_赋值_06

我们这么写代码没有任何问题,能够顺利通过编译。但是,如果我们没有使用复合赋值运算符,而是按如下所示的方式编写代码

Java千问08:关于Java语言复合赋值运算符的两个问题,快来瞧瞧!_赋值运算符_07

在这种情况下,大家可以看到代码不能通过编译。我们把一个算术表达式的运算结果赋值给byte或者是short类型的变量,有时候会引起编译错误,所以按这种方式写代码会导致编译错误。关于引起这种错误的原因,大家可以看我的另一篇文章《​​Java千问05:Java语言中为byte和short类型变量赋值为啥会报错?​​》,该文对此现象有详细解释。我们现在重点讨论使用复合赋值运算符进行操作的时候,同样会有给short类型变量赋值的操作,为什么就不报错呢?原因就是:使用复合赋值运算符在对变量进行赋值的时候,编译器会“暗地里”加上一个强制类型转换的操作。也就是说,使用复合赋值运算符进行操作的时候,实际上等同于如下写法

Java千问08:关于Java语言复合赋值运算符的两个问题,快来瞧瞧!_赋值_08

这种强制类型转换,其实有可能让我们的程序在不经意间产生莫名其妙的错误,请看下面的例子

Java千问08:关于Java语言复合赋值运算符的两个问题,快来瞧瞧!_赋值运算符_09

这一次,我们把a的初始值由原来的2改成了20000,并且在代码中还加入了输出a的语句,那么,输出结果会是多少呢?首先来讲,这段代码并没有报错,那么这个输出结果会让人很多人大吃一惊,它并不是我们想象的80000,而是竟然输出了14464!

Java千问08:关于Java语言复合赋值运算符的两个问题,快来瞧瞧!_Java_10

之所以会输出这样的结果,就是因为80000已经超出了short类型数据的最大值,而我们强制把这个已经超过最大值的“80000”经过强制类型转换赋值给short变量,就会产生“溢出”,最终导致实际赋给变量a的是一个错误的值!最可恶的是,因为是强制类型转换之后进行的赋值,所以编译器并不报错,从而导致很多人掉到坑里还不知道!​

通过这个篇文章,大家可以看到:一个简单的复合赋值运算符竟然也“暗藏杀机”,我们平时编程一定要小心哦!

如果想系统学习Java编程可以点击这里观看我在本站的视频课程。

标签:short,Java,变量,08,复合,运算符,赋值
From: https://blog.51cto.com/mugexuetang/5973833

相关文章

  • JAVA代码审计_若依管理系统
    若依管理系统代码审计该项目使用Mybatis作为数据库持久化框架。全局搜索${、关注xxxmapper.xml文件寻找SQL注入。1)后台角色管理处SQL注入漏洞点“SysRoleMapper.x......
  • windows配置java17
    最近重置系统了,所有东西都得重装一遍。但是为了能继续撸树盖房子,java又是必不可少的,先把java搞回来再说。jdk下载地址https://www.oracle.com/java/technologies/javase......
  • Loki Promtail 使用 multiline 对Java 堆栈日志进行多行处理的示例
    promtail使用multiline处理java多行日志文本的示例Environment:promtail_version:v2.7.1originJavalogcontent:logfilecontentstdout-a.log:2022-Dec-270......
  • JavaWeb
    JavaWeb1、基本概念1.1前言静态webhtmlcss动态web技术栈:Servlet/JSP、ASP、php动态web资源开发技术统称为JavaWeb1.2web应用程序:可以提供浏览......
  • Java String类为什么用final修饰
    在Java语言中,使用final修饰符修饰的类是不可以被继承的,也就是说,如果一个类被声明为final,则不能被其他类所继承。因此,当String类被声明为final时,意味着它不能被其他类所继承......
  • Java入门练习2
    1、循环importjava.util.Scanner;publicclassHello{publicstaticvoidmain(String[]args){Scannerscan=newScanner(System.in);int......
  • Java学习笔记------线程安全问题
    线程的安全问题同步机制解决线程安全问题方式一:同步代码块synchronized(obj){ //需要被同步的代码}synchronized(this){}synchronized(Windows.class){}......
  • Java学习笔记----线程基础
    线程线程,进程可进一步细化为线程,是一个程序内部的一条执行路径线程作为调度和执行的单位,每个线程拥有独立的运行栈和程序计数器,线程切换的开销小线程的创建与启动Java......
  • Java面试题-前端Vue
    Vue的生命周期beforeCreate(创建前)在数据观测和初始化事件还未开始created(创建后)完成数据观测,属性和方法的运算,初始化事件,$el属性还没有显示出来beforeMount(载入前)在......
  • 精心整理Java微服务最全面试题集(含答案)
    微服务架构相关大型网站架构演变过程网站架构演变演变过程传统架构 →分布式架构 → SOA架构 →微服务架构什么是分布式架构分布式架构就是将传统结构按照模块......