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—:因为—在后,所以可以记忆为先用后减。