[关闭]
@wxf 2018-01-17T10:47:10.000000Z 字数 1533 阅读 706

3.基本运算

老马说编程


上节我们介绍了给数据赋值,有了初始值之后,可以对数据进行运算。运算有不同的类型,不同数据类型支持的运算也不一样。本文介绍Java中基本数据类型的主要运算。

算术运算

算术运算符有加(+)减(-)乘(*)除(/),另外还有取模运算(%),以及自增(++)和自减(--)。取模运算适用于整数和字符类型,其他算术运算适用于所有数值类型和字符类型。在这里我们不在赘述算术运算符的用法,但对于字符类型看上去比较奇特,后续会介绍。

加减乘除注意事项

  1. int i = 2147483647 * 2;
  2. //上面的结果为-2,要避免这种情况,我们的结果类型应该使用long,只改为long还是不够的。
  3. //因为运算还是默认按照int进行,需要至少将一个数据表示为long类型,即在后面加L或l
  4. long l = 2147483647 * 2L;
  1. double d = 10/4.0;
  2. double d = 10/(double)4;

小数计算结果不精确

无论是使用float还是double,进行运算时都会出现一些令人困惑的现象。比如:

  1. float f = 0.1 * 0.1;
  2. //其结果应该是0.01,但是实际上,却是0.010000001
  3. double d = 0.1 * 0.1;
  4. //实际结果却是0.010000000000000002

这是怎么回事呢?为什么会出现计算不精确的问题呢。究其原因,我们需要理解float和double的二进制表示,后续文章进行分析。

比较运算

比较运算就是计算两个值之间的关系,其结果是一个布尔类型的值。比较运算适用于所有的数值类型和字符类型。数值类型容易理解,单字符怎么比较呢?后续文章解释。
比较操作符有:大于(>)、大于等于(>=)
小于(<)、小于等于(<=)
等于(==)、不等于(!=)

逻辑运算

逻辑运算根据数据的逻辑关系生成一个布尔值true或false。逻辑运算只可应用于boolean类型的数据,但是比较运算的结果是boolean类型的值,所以其他类型数据的比较结果可以进行逻辑运算。
逻辑运算符包括:
- 与(&):两个都为true才是true,只要有一个是false就是false
- 或(|):只要有一个为true就是true,都是false才是false
- 非(!):针对一个变量,true变成false,false变成true
- 异或(^):两个相同为false,两个不相同为true
- 短路与(&&):和&类似
- 短路或(||):和|类似

&和&&,以及|和||的区别

如果只是进行逻辑运算,它们都是相同的,区别在于同时有其他操作的情况下,例如:

  1. boolean a = true;
  2. int b = 0;
  3. boolean flag = a | b++ > 0;
  4. //flag的结果为true,b的结果为1

因为|后面的表达式也会进行运算,即使只看a已经知道flag的结果。而||则不同,若将代码改为:

  1. boolean a = true;
  2. int b = 0;
  3. boolean flag = a || b++ > 0;
  4. //flag的结果为true,b的结果为0

因为||会“短路”,即在看到||前面部分就可以判定结果的情况下,||会忽略后面的运算。

本节我们介绍了算术运算,比较运算和逻辑运算。但是我们遗留了一些问题,比如:

  1. 整数相乘的结果居然出现了负数
  2. 非常基本的小数运算结果居然不精确
  3. 字符类型怎么也可以进行算术运算和比较

参考资料:

  1. 老马说编程(微信号:laoma_shuo)——基本运算
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注