
1.5 Java运算符和表达式
Java的运算符(operator)是用来指明对操作数所进行的运算。Java的表达式是由标识符、数据和运算符等组合所构成的,主要实现算术、逻辑等运算功能。
1.5.1 Java运算符
Java运算符可分为如下6大类:
(1)算术运算符:+、-、∗、/、%、++、--。
(2)逻辑(布尔)运算符:!、&&、||。
(3)关系(比较)运算符:>、<、>=、<=、==、!=。
(4)位(按位操作)运算符:&、|、^、~、>>、<<、>>>。
(5)赋值、扩展赋值、条件赋值运算符:=、+=、∗=、&=、%=、…、?:。
(6)其他运算符:.、[]、()、,、new、instanceof。
1. 运算符的功能
表1-4是在Java语言体系中使用的运算符及其运算符实现的功能。
表1-4 Java运算符及其功能

2. 运算符优先级别
表1-5是运算符在表达式中参与运算时的先后顺序,即运算的优先级别,优先级别从高到低(表1-5从1到15,同一行内优先级别相同),在表达式中运算符参与运算时先做高级别操作,后做低级别操作。当使用运算符在表达式中参与运算,并且不能确定优先级别时,则可以使用括号“()”,先做括号内操作,后做括号外操作,强制运算的优先级别。
表1-5 运算符参与运算的优先级别

1.5.2 Java表达式
计算机最重要的功能就是运算,运算是通过表达式实现的。Java程序最基础的表达式是由Java运算符和与运算符相匹配的操作数组成的,根据操作数的个数,其表达式可分为单操作数运算(单目运算)、双操作数运算(双目运算)、三操作数运算(三目运算)表达式,对运算符而言,一些可以应用于单操作数运算的运算符叫单目运算符,例如“++”“--”;一些可以应用于双操作数运算的运算符叫双目运算符,例如“+”“>”;一些可以应用于三操作数运算的运算符叫三目运算符,例如“?:”。
单目运算符有:++、--等,单目运算表达式的语法格式为:

【示例1-15】 单目运算符Java源程序代码。

双目运算符有:+、-、∗、/、%、!、&&、||、>、<、>=、<=、==、!=、&、|、^、~、>>、<<、>>>、=、+=、-=、∗=、/=、%=、&=、|=、^=等。双目运算表达式的语法格式为:

【示例1-16】 双目运算符Java源程序代码。

三目运算符只有“?:”,表达式的语法格式为:

说明:当条件成立(condition==true)时,变量variableName内容等于表达式expression1的值;当条件不成立(condition==false)时,变量variableName内容等于表达式expression2的值。“?:”语法格式等同于下面的if-else语句:

【示例1-17】 三目运算符Java源程序代码。

在表达式中,任何一个变量或表达式都有一个确切的类型,类型决定变量可能的取值范围及对变量允许的操作,与变量类型不匹配的操作可能会导致程序出错,变量类型可以是整型、浮点型、布尔型、字符型以及字符串型等的任意一种数据类型。
1.5.3 表达式中运算符的使用规则
在Java体系的表达式中使用的运算符都有其使用原则,在编写表达式之前需要确认使用运算符的正确性。
1. 算术运算符
算术运算符作用于整型或浮点型数据,完成算术运算,联合使用双目运算符可以构成一个算术表达式。
在整数运算时,如果操作数是long类型,则运算结果是long类型,否则为int类型,如果结果超过该类型的取值范围,则按该类型的最大值取模。
在浮点运算时,常规运算符都可以使用,单精度操作数的浮点表达式按单精度运算求值,产生结果为单精度,如果浮点表达式中含有一个或一个以上的双精度操作数,则按照双精度规则运算,其结果是双精度浮点数。在浮点表达式运算中,由于需要将浮点数转换为二进制数后方可运算,受转换精度的限制,在转换过程中就产生误差了,因此浮点运算结果很少是精确的。另外,有些非常规运算对于浮点数而言是给出结果的,并非产生异常,例如,算术溢出、给负数开平方根、被0除等。
【示例1-18】 下面的Java程序并不产生错误,其结果为d1等于Infinity(无穷大),d2等于0.0,d3等于NaN。

当一个正浮点数除以0时所得结果为Infinity,当一个负浮点数除以0时所得结果为-Infinity,而不是出现错误异常指示,用一个非零数去除以无穷大的数其结果等于0.0。
2. 逻辑运算符
逻辑运算符用于进行布尔逻辑运算,布尔变量或布尔表达式组合运算可以产生新的布尔(boolean)值。
【示例1-19】 表现布尔逻辑运算操作的程序。

3. 关系运算符
关系运算符用于比较两个值,返回布尔类型值true或false。关系运算符都是双目运算符,在Java程序中,任何具有相同数据类型的数据都可以比较,例如大于、小于、等于、不等于等。关系运算符常与逻辑运算符组合使用,用作流控制语句的判断条件。
另外,当关系运算符对具有特殊值的浮点变量进行比较运算时,会产生不正确的结果。
【示例1-20】 表现浮点数的特殊值与正常值等比较的程序。

由于在浮点数中NaN是一个无序数,因此也就无法比较大小、赋值等。另外,由于浮点数转换为二进制数时存在误差,因此,微小的两个浮点数的比较可能产生错误的结果。
4. 位运算符
位运算符是针对二进制数个位进行操作的,在Java中位运算符的操作数只能为整型和字符型数据,位运算符是双目运算符。
【示例1-21】 位运算操作的程序。

5. 赋值运算符
赋值运算符主要用于为变量赋值的运算符,Java支持算术运算符和位运算符与赋值操作符的联合使用,并且支持条件赋值运算符“?:”,规则是先运算后赋值。
【示例1-22】 运算符和赋值符联合使用的程序。
