提到+=,我想大家一定会立刻想到下面的代码:

short a=3;
        a=a+1;
        a+=3;

问:上面第二行代码和第三行代码在编译时都能通过吗?

老师说:第二行代码在编译时不能通过,第三行代码相当于第二行代码。

这时你晕了吗——既然第三行代码相当于第二行代码,那为什么第二行代码在编译时不能通过呢?

让我来给你讲讲吧:

首先先来看第一行代码“short a=3;”,只要稍有常识的人都知道这行代码并没有错,那是因为“=”为赋值运算符3为int类型,这行代码之所以没有问题是因为程序在执行的时候会将int类型的数值强转为short类型,分析到这基本上就可以回答这个问题了:“+=”和“=”一样也是赋值运算符,既然是这样那么它具有和“=”一样的特点,所以“ a+=3;”不会在编译时出错。至于“第三行代码相当于第二行代码”,这句话说得有点不太准确,想来应该这样说:单单从最终的结果上来看第三行代码的结果和第二行代码的结果相同。

为什么第二行代码在编译时不能通过:那时因为第二行代码代码的右侧为算术运算,在java可发语言中算术运算有这样一个特点:如果两个数为不同类型的的数,在运算时会将低数据类型的数提升为高数据类型的数。到此就不难回答这个问题了:a为short类型,1为int类型,进行加法运算会先将a提升为int类型,即相当于(int)a+1,这时a+1就变为了int类型,而a变量依然为short类型,所以会出错了。

上面阐述的有点罗嗦,还是用老师的解释吧,呵呵

a=a+1;//编译失败,因为等号右边a会被提升为int类型,运算后的结果还是int类型,无法赋值给short类型。

a+=3;//编译通过,因为+=运算符在给a赋值的同时,也自动完成了强转操作。

对+=赋值运算符的认识相关推荐

  1. Python 赋值运算符

    赋值运算符 运算符 说明 举例 = 简单的赋值运算 c = a + b  将 a + b 的运算结果赋值为 c += 加法赋值运算 c += a 等效于 c = c + a -= 减法赋值运算 c - ...

  2. Go 学习笔记(5)— 算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、取地址和指针运算符

    1. Go 运算符分类 Go 语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 1.1 算术运算符 下表列出了所有Go语言的算术运算符.假定 A 值为 10, ...

  3. C++ 拷贝构造函数和重载赋值运算符的区别

    文章目录 拷贝构造函数 重载赋值运算符 赋值运算符和拷贝构造函数最大区别是赋值运算符没有新的对象生成,而拷贝构造函数会生成新的对象. 为了更加形象 准确得描述 赋值运算符和拷贝构造函数得区别,将详细通 ...

  4. python运算符(算数运算符、赋值运算符、复合赋值运算符、比较运算符、逻辑运算符)

    常见的运算符: 算数运算符 赋值运算符 复合赋值运算符 ⽐较运算符 逻辑运算符 1. 算数运算符 注意:         混合运算优先级顺序: () ⾼于 ** ⾼于 * / // % ⾼于 + - ...

  5. 深入解析Python中的变量和赋值运算符

    Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据 ...

  6. Python赋值运算符(入门必读)

    赋值运算符用来把右侧的值传递给左侧的变量(或者常量):可以直接将右侧的值交给左侧的变量,也可以进行某些运算后再交给左侧的变量,比如加减乘除.函数调用.逻辑运算等. [Python] 中最基本的赋值运算 ...

  7. C++赋值运算符与赋值表达式

    C++提供了几个赋值运算符,最简单的赋值运算符就是"=".带有赋值运算符的表达式被称为赋值表达式. 如果在赋值表达式后面加上分号,便成为了赋值语句.赋值表达式与赋值语句的不同点在于 ...

  8. C++中重载赋值运算符=

    1.C++重载=(赋值运算符) 在定义的同时进行赋值叫做初始化(Initialization),定义完成以后再赋值(不管在定义的时候有没有赋值)就叫做赋值(Assignment).初始化只能有一次,赋 ...

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

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

  10. C++本质:类的赋值运算符=的重载,以及深拷贝和浅拷贝

    关键词:构造函数,浅拷贝,深拷贝,堆栈(stack),堆heap,赋值运算符 摘要:     在面向对象程序设计中,对象间的相互拷贝和赋值是经常进行的操作.     如果对象在申明的同时马上进行的初始 ...

最新文章

  1. python语句块标记_Python简单语句
  2. 系统安全运维 Server 2008 R2 事件查看器实现日志分析
  3. QTP的那些事--终极项目脚本设计思路及其测试查询功能的一些实际项目体会
  4. gdb可以查询执行文件的宏, 但是查询不了o文件的宏
  5. yum如何安装特定版本的gcc_linux下如何升级python
  6. ActionForm
  7. ccd后视摄像头_预计2021年全球车载摄像头总出货将达到1.43亿颗
  8. 三星s8html查看器,三星S8/S8+ 刷机软件工具
  9. CMD命令查看WiFi密码
  10. 从一位前阿里P7被裁员,聊技术人的第二职业!
  11. Java解析多种文件输出字符串以及图片(ppt、odc、odcx、pptx、xls、xlsx、rtf)
  12. java实验2总结心得,java实验的心得体会
  13. speedoffice(Excel)怎么给文字加粗
  14. Android 仿微信裁剪图片
  15. python-(6)常用的字符判断和转换以及开头结尾匹配
  16. 2016年期货市场(2017年期货)
  17. GitHub疯狂转发!阿里巴巴彩版java性能调优实战,终于到手了!文末福利
  18. JSP中四大作用域和九大内置对象
  19. 【HDU 杭电 5671 Matrix】
  20. 学习笔记18--定位系统之差分定位系统

热门文章

  1. 德州扑克的思考和实验
  2. eclipse与myeclipse恢复已删除的文件和代码
  3. VC++实现标准型计算器步骤及源码
  4. Python与MongoDB的交互
  5. Nginx限制访问次数和并发数
  6. 对js原型简单的理解和图解
  7. Scala 深入浅出实战经典 第91讲:Akka第一个案例动手实战架构设计
  8. 完美配置Tomcat的HTTPS
  9. oracle wmsys.wm_concat函数
  10. 高兴与愉快的心情,难以言语。