3.6 运算符

运算符就是在用变量或常量进行运算时,经常需要用到的符号,目前常用的总共有10种:算术运算符、关系运算符、逻辑运算符、位运算符、移位运算符、赋值运算符、三元运算符、逗号运算符、字符串运算符(将在第6章介绍)、转型运算符。下面将会对每种运算符结合实例作详细的讲述。

3.6.1 算术运算符

从小学开始就学过“加”、“减”、“乘”、“除”、“余”,其实这也是Java中的算术运算符。下面来看一种情况,当一个浮点数据加上一个整型数据,其结果是什么类型的数据?这涉及了数字精度问题,在不同类型的数据之间进行运算时,为了使结果更加精确,系统会将结果自动转化为精度更高的数据类型。

【实例3.15】以上所述的定义有点复杂,通过下面的例子进行说明。


01 ///这里的a是一个整型数据

02 ///这里的b是一个浮点型数据

03 ///相加后就是一个浮点型数据

04 public class var4

05 {

06 public static void main(String[]args)

07 {

08 int a=10;

09 float b=10f;

10 System.out.println("a+b="+(a+b));

11 }

12 }


【代码说明】第8行定义了整型变量a,第9行定义了浮点型变量b,第10行在控制台输出两个变量进行“加”运算后的结果。

【运行效果】


a+b=20.0


以上的程序代码中,变量“a”是整型,变量“b”是单精度浮点型,运算的结果是单精度浮点型。以上的实例说明了一点:为了保证经过算术运算符后结果的数据精度,尽量让结果与运算数据中精度较高的类型相同。这个例子就是让结果与“a”、“b”中精度较高的单精度浮点类型b类型相同,所以结果类型就是单精度浮点的数据类型。

如何将结果进行转换?转化有什么规律吗?笔者根据经验总结了以下几点。

❑当使用运算符把两个操作数结合到一起时,首先会将两个操作数转化成相同类型的数据。

❑两个操作数中如有一个是double型,那么另一个操作数一定先转化成double型,再进行运算。

❑两个操作数中如有一个是float型,那么另一个操作数一定先转化成float型,再进行运算。

❑两个操作数中如有一个是long型,那么另一个操作数一定先转化成long型,再进行运算。

❑其他任何两个基本类型数据操作,两个操作数都会自动转化成int型。

明白了数据精度的问题,再回到算术运算符的应用。算术运算符总共有7种:“+”、“-”、“*”、“/”、“%”(余数)、“++”(自加)、“—”(自减)。

【实例3.16】下面通过程序段来熟悉这些运算符的用法。


01 ///两个整型变量a, b通过算术运算符得出的结果

02 public class data1

03 {

04 public static void main(String[]args)

05 {

06 int a=10;

07 int b=3;

08 System.out.println("a+b="+(a+b));

09 System.out.println("a-b="+(a-b));

10 System.out.println("ab="+(ab));

11 System.out.println("a/b="+(a/b));

12 System.out.println("a%b="+(a%b));

13 }

14 }


【代码说明】第6~7行先定义两个整型变量,然后通过第8~12行的加、减、乘、除和求余运算,在控制台输出计算结果。

【运行效果】


a+b=13

a-b=7

a*b=30

a/b=3

a%b=1


下面重点讨论自加和自减运算符的用法,它可以使一个变量自动加1和自动减1,得到的值再赋给这个变量。

【实例3.17】自加运算符又分为两种:一种是前自加,一种是后自加。下面通过一个程序段看看什么是前自加和后自加。


01 public class data2

02 {

03 public static void main(String[]args)

04 {

05 int a=10;

06 System.out.println("a="+(a++));

07 }

08 }


【代码说明】上面的程序段介绍了后自加,其意义就是:先把a的值赋给a,然后,将a的值加1,存储到内存空间。于是,a输出的值就是10,而存储在内存中的a的值为11。

【运行效果】


a=10


【实例3.18】再看看下面的程序段。


01 public class data3

02 {

03 public static void main(String[]args)

04 {

05 int a=10;

06 System.out.println("a="+(++a));

07 }

08 }


【代码说明】上面的程序段演示了前自加,其意义就是:先让a的值加1,然后再将这个加之后的值赋给a。于是,a的输出值当然就是11。

【运行效果】


a=11


【实例3.19】下面来看一个综合的实例。


01 public class data4

02 {

03 public static void main(String[]args)

04 {

05 int a=10;

06 System.out.println("a="+(a++));

07 System.out.println("a="+(++a));

08 }

09 }


【代码说明】这个程序段首先将a的值赋值给a,然后再将a加1放到内存中,内存中的值为11,那么第一个打印语句的结果就是a=10,接下来,将内存中a的值加1再赋给a,那么a的值为12。

【运行效果】


a=10

a=12


同样自减运算符也有两种:一种是前自减,一种是后自减。

【实例3.20】先看下面的程序代码。


01 public class data5

02 {

03 public static void main(String[]args)

04 {

05 int a=10;

06 System.out.println("a="+(—a));

07 }

08 }


【代码说明】这个程序段介绍的是前自减,其意义是:先将a的值减1,然后赋值给a,于是a的结果就是9。

【运行效果】


a=9


【实例3.21】再来看看下面的程序段。


01 public class data6

02 {

03 public static void main(String[]args)

04 {

05 int a=10;

06 System.out.println("a="+(a—));

07 }

08 }


【代码说明】这个程序段介绍的是后自减,其意义是:将a的值赋给a后,再将a的值自动减1,于是输出a是10。

【运行效果】


a=10


【实例3.22】下面再看一个综合实例。


01 public class data7

02 {

03 public static void main(String[]args)

04 {

05 int a=10;

06 System.out.println("a="+(a—));

07 System.out.println("a="+(—a));

08 }

09 }


【代码说明】这个程序段首先将a的值赋值给a,然后再将a减1放到内存中,内存中的值为9。那么第一个打印语句的结果就是a=10。接下来,将内存中a的值减1再赋给a,那么a的值为8。

【运行效果】


a=10

a=8


【实例3.23】在现实的编程中,可能会遇到更加复杂的代码段。下面继续看一个综合的实例。


01 public class data8

02 {

03 public static void main(String[]args)

04 {

05 int a=10;

06 System.out.println("a="+(a—));

07 System.out.println("a="+(—a));

08 System.out.println("a="+(a++));

09 System.out.println("a="+(++a));

10 }

11 }


【代码说明】首先将a的值赋给a,然后将a自动减1放到内存中,此时内存中值为9,所以第一个打印语句输出的值为10。接着,将内存的值先减1再赋给a, a就为8。随后,将a的值先赋给a,再将a的值加1放到内存中,所以内存中a为9。最后将内存中的值加1再赋给a, a的值为10。

【运行效果】


a=10

a=8

a=8

a=10


为了能方便地记忆自加和自减运算符的用法,总结如下:

❑++x:因为++在前,所以可以记忆为先加后用。

❑x++:因为++在后,所以可以记忆为先用后加。

❑—x:因为—在前,所以可以记忆为先减后用。

❑x—:因为—在后,所以可以记忆为先用后减。