2.4 运算符与表达式
Java语言有着相当广泛的运算功能。所谓运算,就是通过某些运算符将一个或多个运算对象连接起来,组成一个符合Java语法的式子,这样的式子被称为表达式,系统经过对表达式的处理,产生一定的结果。其中,运算对象必须属于某种确定的数据类型。对大多数的运算符来说,运算符的前后都需要有运算对象,这种运算符称为二元运算符。但也有些运算符,它的运算对象只有一个,例如,对一个数进行取负值(-)的运算,这种运算符便称为一元运算符。Java的运算符主要有以下几类:赋值运算符、算术运算符、关系运算符、逻辑运算符、复合赋值运算符等。下面分别做介绍。

2.4.1 赋值运算符与赋值表达式
当需要为各种不同的变量赋值时,就必须使用赋值运算符“=”,这里的“=”不是“等于”的意思,而是“赋值”的意思,例如:   
a1=3;
这个语句的作用是将整数3赋值给变量a1。使变量a1此时拥有的值为3。再看下面的语句:
a1=a1+1;
大家知道,这种表示方法在数学上是行不通的,但作为赋值语句,在以后的程序设计中是经常用到的,把a1加1后的结果再赋值给变量a1存放,若此语句执行前a1的值为3,则本语句执行后,a1的值将变为4。
有时我们经常使用这样的语句:   
j=i=3;
这种语句系统的处理方式是:首先将整数3赋值给变量i,然后将(i=3)这部分内容转换成赋值表达式,这个表达式的值(运算结果)也是3,最后再将表达式(i=3)的值赋值给j,因此,此时变量j的值为3。

2.4.2 算术运算符与算术表达式
算术运算符大多用于数学运算,如表2ˉ8所示。

例2.4.1 算术运算符在程序中的使用。

本程序的运行结果如下: 

如果要进行加1或者减1的运算,可以使用一种快捷运算符,或者又称为递增和递减运算符:“++”和“--”。
前面已经说过:如果在程序中定义了变量i,在程序运行时想让它的值增1,可使用语句:
i=i+1;
此时若使用另外的语句:   
i++;
则两句语句的意义是相同的。
递增运算符是一元运算符,它可以被放在运算对象的后面(i++),也可以被放在运算对象的前面(++i)。必须注意的是这两者所代表的意义是不一样的,i++的执行原则是先引用,后增1。递增(递减)运算符运算和执行原则如表2ˉ9所示。 

例如对如下的语句块:  
int i=3;
System.out.println(i++);
此时的输出结果为3,待输出结束后,i才增值为4。
++i的执行原则则相反:是先增1,后引用。如对如下的语句块:     
int i=3;
System.out.println(++i);
此时的输出结果为4,i先增值为4,然后输出结果。

2.4.3 关系运算符与关系表达式
关系运算实际上是“比较运算”,将两个值进行比较,判断比较的结果是否符合给定的条件,Java的关系运算符都是二元运算符,由Java关系运算符组成的关系表达式的计算结果为布尔类型(即逻辑型),具体的关系运算符和其说明和执行原则如表2ˉ10所示。

在Java中,任何数据类型的数据(包括基本数据类型和复合数据类型)都可以通过“==”与“!=”来比较表达式的结果是否成立。
关系运算符经常与逻辑运算符一起使用,作为程序流控制语句的判断条件。

2.4.4 逻辑运算符与逻辑表达式
逻辑运算符经常用来连接关系表达式,对关系表达式的值进行逻辑运算,因此逻辑运算符的运算对象必须是逻辑型数据,其逻辑表达式的运行结果也是逻辑型数据。Java的逻辑运算符有三种,具体表示与运算规则如表2ˉ11与表2ˉ12所示。

逻辑运算符运算规则:  

逻辑表达式往往可用于表示比较复杂的条件,例如要判别某一年(year)是否是闰年,闰年的判别条件是:能被4整除但不能被100整除,或者能被400整除。可以用一个逻辑表达式来表示:

当year为某一整数值时,上述表达式值为true,则year年为闰年,否则为非闰年。
例2.4.2 关系运算符与逻辑运算符在程序中的使用。

根据关系运算符与逻辑运算符的运算规则,本程序的运行结果为true。
在Java中,运算符&&和||的运算规则遵循一种在电工学中称为“短路”的执行方式,即对于逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的结果时,才执行该运算符。例如:
1)a&&b&&c:如果a非真,则不再判别b和c,直接输出表达式的值为false;若a为真,则判别b,若b非真,则不再判别c,直接输出表达式的值为false;当a、b同时为真,才判别c的真假。
2)a||b||c:如果a为真,则不再判别b和c,直接输出表达式的值为true;若a非真,则判别b,若b为真,则不再判别c,直接输出表达式的值为true;当a、b同时非真,才判别c的真假。 

2.4.5 复合赋值运算符
复合赋值运算符是一种将算术运算符与赋值运算符相结合的一种运算符,这些运算符的说明及使用方式如表2ˉ13所示。 

例2.4.3 复合赋值运算符在程序中的简单使用。

本程序的运行结果是:

2.4.6 其他运算符
1.位运算符

位运算符用来对二进制位进行操作,其具体说明如表2ˉ14所示。


说明:对于位移运算符“>>”与“<<”,假设现有数15,其二进制值为1111,向右移动后形式为0111,故转换为十进制数为7;向左移动后形式为11110,故转换为十进制数为30。它们被称为算术位移运算符。
2.条件运算符:?:
条件运算符是三元运算符,其使用的语法形式为:    
<表达式>?e1:e2
其中表达式值的类型为逻辑型,若表达式的值为真,则返回e1的值;表达式的值为非真,则返回e2的值。
设有下列代码语句:   
int a=3,b=6,c;
c=(a>b)?1:2;
则执行后c的值为2。

2.4.7 运算符的优先级与结合性
Java语言规定了运算符的优先级与结合性。优先级是指同一表达式中多个运算符被执行的次序,在表达式求值时,先按运算符的优先级别由高到低的次序执行,例如,算术运算符中采用“先乘除后加减”。如果在一个运算对象两侧的优先级别相同,则按规定的“结合方向”处理,称为运算符的“结合性”。Java规定了各种运算符的结合性,如算术运算符的结合方向为“自左至右”,即先左后右。Java中也有一些运算符的结合性是“自右至左”的。
例如:
当a=3;b=4时
若k=a-5+b,则k=2(先计算a-5,再计算-2+b)
若k=a+=b-=2,则k=5(先计算b-=2,再计算a+=2)
表2ˉ15列出了各个运算符优先级别的排列和其结合性,数字越小的表示优先级别越高,初学者在使用运算符时,请经常参考下列表格。