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

上面的这两条语句相当于

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

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

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

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

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

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

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

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

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

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

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

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

如果希望系统学习Java编程,可以点击下面的链接观看我的视频课程,有问题也可以加入的QQ群291839907一起讨论

沙利穆_腾讯课堂​shalimu.ke.qq.com

复合的赋值运算符例题_Java千问:关于Java语言复合赋值运算符的两个问题,快来瞧瞧!...相关推荐

  1. java main 参数传递参数_Java千问:Java语言如何给main方法传递参数?

    大家都知道,Java语言运行程序的入口方法叫做main,这个方法有一个参数,这就表示说,我们要运行主方法,就必须给main方法传递一个参数.但是,大家似乎对这个参数向来都是视而不见,从来都没给主方法传 ...

  2. java中可以用浮点作为循环变量吗_Java千问:Java循环语句的几个冷门知识点你都知道吗?...

    我们在进行Java开发的时候,经常会用到循环结构,但是有几个关于循环的"冷门"知识点,不知道你是不是都已经掌握了呢?我们一起来看看 一.大括号可以不写吗? 我们都知道,如果每次循环 ...

  3. Java千问:Java语言各种数字的“非常规”写法你都会吗?

    Java程序中总是会出现一些数字.我们通常都是用常规的方式来表示这些数字,如以下代码所示 int a = 1;double b = 1.5; 但是数字也可以有非常规写法,在这里我们用一篇短文简单总结一 ...

  4. Java千问:Java语言位运算符详解

    很多编程语言都有位运算符,Java语言也不例外.在Java语言中,提供了7种位运算符,分别是按位与(&).按位或(|).按位异或(^).取反(~).左移(<<).带符号右移(> ...

  5. java语言编程基础_Java编程基础02——Java语言基础

    1_(常量的概述和使用)* A:什么是常量(constant) 在程序执行的过程中其值不可以发生改变 B:Java中常量的分类 字面值常量 自定义常量(面向对象部分讲) C:字面值常量的分类 字符串常 ...

  6. 复合的赋值运算符例题_Java学习:运算符的使用与注意事项

    运算符的使用与注意事项 四则运算当中的加号"+"有常见的三种用法: 对于数值来,那就是加法. 对于字符char类型来说,在计算之前,char会被提升成为int,然后再计算.char ...

  7. int** 赋值_关于Java语言复合赋值运算符的两个问题,快来瞧瞧

    短文涨姿势,看了不白看,不关注等啥? 我们知道,在Java以及很多高级编程语言当中,都有一种运算符叫做复合赋值运算符.复合赋值运算符由两个符号组成,它所能完成的运算操作也分为两步:第一步是运算,第二步 ...

  8. java类描述_java笔记2:Java语言中的类和对象的描述

    在Java 语言中,除8 个基本数据类型值之外, 一切都是对象,而对象就是面向对象程序设计的中心. 对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还 ...

  9. 围观阿里ChatGTP---通义千问大模型测试

    围观阿里ChatGTP-通义千问大模型测试 围观阿里ChatGTP---通义千问大模型测试 **通义千问大模型能力测试规则** **人工智能自我介绍** **人工智能代码生成** **人工智能文学创作 ...

最新文章

  1. 图例放在图的外面_Origin做双Y轴箱型图(图文讲解)
  2. 5G 信令流程 — 5GS 的 gNB 切换(Xn/N2 Handover)管理
  3. NYOJ 660 逃离地球
  4. 今天的作业 --- 去重
  5. qt android程序联网死机,Qt for Android(九) ——APP 崩溃卡死拉起保活实战
  6. idea创建管理项目
  7. 计算机一级windows系统操作知识点,计算机一级考试:高分必看知识点之windows操作...
  8. python数据结构-图
  9. 项目构建之maven篇:3.m2eclipse使用
  10. 解决pgadmin4导入导出数据时报错 Utility file not found. Please correct the Binary Path in the Preferences dialog
  11. 向量的方向余弦公式_方向余弦怎么求
  12. java 汇率换算_[java] 汇率换算器实现(2)
  13. 怎么将自己的头像p到特定的背景图_做个背景透明的头像,让自己的微信与众不同...
  14. 立体视觉入门指南(6):对级约束与Fusiello法极线校正
  15. 28:全局变量的使用
  16. 解决 Missing GL version
  17. Ubuntu 20.04 修改笔记本亮度
  18. 系统校验矩阵怎么求_软考高级架构师:计算机系统基础知识
  19. 条码应用与企业ERP无缝集成
  20. top-level object

热门文章

  1. Nature综述: 地球上细菌和古菌的生物被膜丰度
  2. Nature综述:Rob Knight带你分析微生物组数据(2020版)
  3. 行业盛会!2018中国人体微生物组大会
  4. Win8 x64 + Office Word 2013 x64 无法自动加载 Endnote X6 的解决方案
  5. R语言使用caret包构建随机森林模型(random forest)构建回归模型、通过method参数指定算法名称、通过ntree参数指定随机森林中树的个数
  6. pandas使用split函数将dataframe中的特定列表字段(list column)裂变为多个数据列并拼接到原dataframe中
  7. R语言使用pwr包的pwr.t.test函数对分组样本数相同的t检验进行效用分析(power analysis)、在已知效应量(effect size)、显著性水平、样本量的情况下计算假设检验的效用值
  8. R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(添加均值、中位数)实战
  9. 集成学习--百面机器学习
  10. 经典大数据面试题及解析