这是今天在开发当中遇到的问题,虽然不是很大,但还是花了一点时间去琢磨。

嗯,好了。先看一段源代码

   short value=2;
value-=2;

源码就是上面这个样子的,我动手写的时候因为理解的问题,把代码改成了这个样子

   short value=2;
value=value-2;

这时候编译器就和我杠上了,报第二行有错。想想也对, value 变量和一个整型运算后 Java 会自动将运算结果提升到 int 类型,这和 value 定义的时候的 short 类型的产生矛盾。

提供的修改意见有两个:

1)把 value的类型改为 int ;

2)把value-2的运算结果强制转换为 short 类型;

第一段代码没有报错,那说明类型转换没有问题,就是说复合赋值运算里面有个偷偷摸摸类型转换的过程,但究竟是怎样转换的,采用的修改意见1)还是2)?

翻翻了手头的书,个人理解如下:

第一段代码并不是我理解的:   value-=2  和 value=value-2 划等号;

准确的表述应该是这样的:       value-2  等价于 value=(value 的类型) (value-2) ;

所以说在复合赋值运算当中,会自动将他计算的结果值强制类型转换为左侧的类型。

当然结果和左侧类型相同的时候就不会有任何的影响。

顺藤摸瓜,如果左边的类型要比计算结果的那个类型范围要小?肯定会丧失精确,造成Bug 比如:

short value=2;
//系统自动隐身的类型转换
value+=80000//从高位截断,发生了溢出,结果不是你想要的
System.out.println(valueA);

总结一下:

优点:复合赋值运算方便,简单。而且很有效率,在性能上面也有优势;

缺点:在你最不设防的精度问题上面背后给你一枪。

所以在你运算符左边是个小范围而右边的运算结果是个大范围的时候,一定要小心。

Java 基础【06】复合赋值运算的更多相关文章

  1. Java基础东西(按位操作运算)

    http://aokunsang.iteye.com/blog/615658 前奏:   昨天一哥们问我Java位移你会吗,我说不会,想想位移这么麻烦,一般有位移的Java代码一律不看,有几个人会啊, ...

  2. JAVA基础1——字节&位运算

    占用字节数 & 取值范围 Java一共有8种基本数据类型(原始数据类型): 类型 存储要求 范围(包含) 默认值 包装类 int 4字节(32位) -2^31~ 2^31-1 0 Intege ...

  3. Java基础06 组合

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们已经尝试去定义类.定义类,就是新建了一种类型(type).有了类,我们接着构造 ...

  4. java基础06 Java中的递归

      一.递归是指直接或间接地调用自身. 二.递归的注意事项:             A:要有出口,否则就是死递归 B:次数不能过多,否则内存溢出 C:构造方法不能递归使用     三.举例子  递归 ...

  5. Java基础06 组合(转载)

    在一个新类的定义中使用其他对象.这就是组合(composition).组合是在Java中实现程序复用(reusibility)的基本手段之一.   组合与"has-a" 一个对象是 ...

  6. java基础06 IO流

    IO用于在设备间进行数据传输的操作. Java IO流类图结构:   IO流分类 字节流: InputStream FileInputStream BufferedInputStream Output ...

  7. java基础06 switch

    public class SwitchDemo01 { /** * 韩嫣参加计算机编程大赛 如果获得第一名,将参加麻省理工大学组织的1个月夏令营 如果获得第二名,将奖励惠普笔记本电脑一部 如果获得第三 ...

  8. 057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和

    057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和 本文知识点:求整型数组的数组元素的元素值累加和 案例:求整型数 ...

  9. 056 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 03 一维数组的应用

    056 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 03 一维数组的应用 本文知识点:数组的实际应用 程序开发中如何应用数组? 程序代码及其运行结果: 不同数据类 ...

随机推荐

  1. vue 项目白屏解决方案

    在做的项目是使用 vue-cli 脚手架为基础的,只能使用微信浏览器打开的.在某次更新功能代码后,被反馈在一些手机上会出现白屏.经过一番探索,多管齐下解决了问题 白屏可能的原因: es6 代码没有被编 ...

  2. 事务控制语言DTL

    一.什么是事务? · 数据库中的事务,是指可以将“多条相关语句执行”看做是“一条语句执行”的一种内部机制.即事务是一种可以保证“多条语句一次性执行完成”或者一条语句都不执行的机制. 三.事务的特点 原 ...

  3. unix cc编译过程

    1.编译并链接一个完全包含与一个源文件的C程序:                cc program.c     这条命令产生一个称为a.out的可执行程序.中间会产生一个名为program.o的目标 ...

  4. HDU4010 Query on The Trees (LCT动态树)

    Query on The Trees Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Othe ...

  5. JAVA-基础(三)

    Character 类型字符(Character)是围绕字符型(char)的一个简单的包装器.字符(Character)的构造函数如下:Character(char ch)这里ch指定了被创建的字符( ...

  6. windows基本DOS命令

    基本命令 dir : 列出当前目录下的文件以及文件夹,后面可以接其他路径 md : 创建目录(mkdir),一次创建多级目录,mkdir a\b\c rd : 删除目录,删除非空目录rd /s(删除最 ...

  7. day01_11.break和continue

    1.continue 下一个(用next更加形象一点)整体的循环没有被破坏掉,而是跳到下一个循环单位中 <?php for($i=1;$i<=10;$i++){ if($i==4){ co ...

  8. ef添加数据时出错 System.Data.Entity.Infrastructure.DbUpdateConcurrencyException”类型的异常

    找半天才找到 ef添加数据时出错原因:数据库表中没有主键 ,就算表中有自增列 Added方法也会报错: -        this._db.SaveChanges() “this._db.SaveCh ...

  9. [办公软件][2]screenToGif

    https://github.com/NickeManarin/ScreenToGif/wiki/help 下载: .Net Framework 4.6.1   https://www.microso ...

  10. C语言总结(5)

    一.函数的定义: 函数是一个完成特定工作的独立程序模块,包括库函数和自定义函数.例如:scanf(),printf()为库函数,cylinder(),fact()为自定义函数. 函数定义的一般形式: ...