Java从入门到项目实战(全程视频版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.4 运算符

img

Java中的语句有很多种形式,表达式就是其中的一种形式。表达式由操作数与运算符组成:操作数可以是常量、变量或方法,而运算符就是数学中的运算符号“+”“-”“*”“/”“%”等。以表达式“z+10”为例,z与10都是操作数,而“+”就是运算符,如图2-5所示。

img

图2-5 表达式是由操作数与运算符所组成

Java提供了许多运算符,这些运算符除了可以处理一般的数学运算外,还可以进行逻辑运算、地址运算等。根据其所使用的类的不同,运算符可分为赋值运算符、算术运算符、关系运算符、逻辑运算符、条件运算符、括号运算符等。常见的运算符及其基本的操作范例如表2-3所示。

表2-3 Java运算符

img

续表

img

除了表2-3给出的运算符之外,各个运算符之间也存在着不同的运算优先级,这些优先级如表2-4所示。

表2-4 Java运算符优先级

img

提示:没有必要去记住这些优先级。

从实际的工作来讲,这些运算符的优先级没有必要专门去记,就算勉强记住了,使用起来也很麻烦,所以在此笔者建议读者多使用“()”去改变优先级才是最好的方式。

注意:不要写复杂的运算操作。

在使用运算符编写语句的时候,读者一定不要写出以下的类似代码。

范例:不建议使用的代码

img

虽然以上的程序可以得出最终的计算结果,但是面对如此复杂的运算,相信大部分人都没有太大的兴趣。所以在编写程序的时候,读者应该本着编写“简单代码”这一原则。

2.4.1 数学运算符

img

程序是一个数据处理的逻辑单元,同时也是以数学为基础的学科,在Java中提供的运算符可以实现基础四则运算、数值自增或自减运算,运算符如表2-5所示。

表2-5 算术运算符

img

范例:四则运算

img

在四则运算之中默认的顺序是先乘除后加减,在本程序中使用括号修改了默认的优先级。

范例:模运算

img

Java中使用“%”运算符实现了模运算(余数),所以10模3的结果就是1。

在Java中为了简化数学运算与赋值的操作,也提供有一些简化结构,如表2-6所示,这些运算符表示参与运算后直接进行赋值操作。

表2-6 简化赋值运算符

img

续表

img

范例:使用简化运算符

img

在数值型变量定义后也可以方便地实现数据自增与自减的操作,该操作主要使用“++”与“--”两种操作符完成,而根据所处位置的不同,实现机制也不同,如表2-7所示。

表2-7 自增与自减机制

img

范例:实现自增与自减操作

img

本程序在进行计算时采用了混合运算符,首先会计算“++ x”的结果11,随后将此计算后的结果与“y”做减法处理,所以最终的结果就是“-9”,当y参与计算后执行自减处理,变量y的内容变为19。

2.4.2 关系运算符

img

关系运算的主要特征就是进行大小的比较处理,包括大于(〉)、小于(〈)、大于等于(〉=)、小于等于(〈=)、不等(!=)、相等(==)。所有的关系运算返回的判断结果都是布尔类型的数据。

范例:大小关系判断

img

本程序主要实现了两个整型变量的大小判断,由于变量x的内容小于变量y的内容,所以判断的结果为false。

范例:相等判断

img

本程序使用“==”运算符判断了两个数据变量是否相同,由于int与double属于两种类型,所以首先会将int变为double类型后再进行比较。

范例:相等判断

img

本程序判断了int与char两种不同类型的内容是否相同,由于char可以与int实现自动类型转换,所以此时会先将char变为int(获取相应编码)而后再进行相等判断。

2.4.3 三目运算符

img

在进行程序开发的时候三目运算符使用的非常多,而且合理地利用三目运算可以减少一些判断逻辑的编写。三目是一种所谓的赋值运算处理。它是需要设置一个逻辑关系的判断之后才可以进行的赋值操作,基本语法如下。

数据类型变量=关系运算?关系满足时的内容:关系不满足时的内容;

范例:使用三目赋值

img

本程序利用三目运算符判断了变量x与变量y的大小,并且将数值大的内容赋值给变量max。

提示:三目运算符简化if判断逻辑。

如果不使用三目运算符,那么以上范例也可以通过以下的if语句结构来代替。

范例:使用if结构代替

img

此时程序的执行结果相同,但是会发现为实现同样的功能需要编写更多的代码。

2.4.4 逻辑运算符

img

逻辑运算一共包含3种:与(多个条件一起满足)、或(多个条件有一个满足)、非(使用“!”操作,可以实现true与false的相互转换),逻辑运算符如表2-8所示。

表2-8 逻辑运算符

img

通过逻辑运算符可以实现若干个条件的连接,“与”和“或”操作的真值表,如表2-9所示。

表2-9 与、或真值表

img

范例:使用“非”运算符

img

在本程序中括号内的表达式“1〉2”的判断结果为false,但是当使用了非运算(!)后结果转为true。

“与”逻辑运算的主要特征是进行若干个判断条件的连接,并且如果所有的条件都返回true的时候最终才会返回true,有一个条件为false,最终的结果就是false。

范例:“与”逻辑运算

img
img

在本程序中执行了两个判断条件:“x==y”“2〉1”,由于此时两个判断条件的结果全部为true,所以逻辑“与”执行后的结果就是true。

提示:关于“&”和“&&”的区别。

“与”逻辑的操作需要若干判断条件全部返回true,最终的结果才为true;如果有一个判断条件为false,那么不管有多少个true最终的结果一定就是false。所以在Java中针对于逻辑“与”操作提供有两类运算符。

img普通与逻辑(&):所有的判断条件都进行判断。

img短路与逻辑(&&):如果前面的判断条件返回了false,直接中断后续的判断条件执行,最终的结果就是false。

为了更好地帮助读者理解两种逻辑与运算的区别,下面通过两个具体的程序进行分析。

范例:使用普通“与”逻辑运算符

img

在程序中任何的数字除以0都会产生ArithmeticException算数异常信息,那么也就证明此时两个判断条件全部执行了,但对于此时的程序来讲“1〉2”的关系运算结果为false,即后续的所有判断不管返回有多少个true最终的结果都只能是false,而此时普通“与”(&)逻辑使用的意义就不大了,那么最好的做法是使用短路“与”逻辑(&&)。

范例:使用短路“与”逻辑运算符

img

本程序使用短路“与”逻辑,可以发现条件2并没有执行,即短路“与”的判断性能要比普通“与”的要好。

“或”逻辑运算也可以连接若干个判断条件,在这若干个判断条件中有一个判断结果为true,最终的结果就是true。

范例:“或”逻辑运算

img
img

本程序设置了两个判断条件,由于此时第二个判断条件“2〉1”返回true,最终“或”运算的结果就是true。

提示:关于“|”和“||”的区别。

“或”逻辑运算的操作特点就是若干个判断条件有一个返回了true,那么最终的结果就是true,所以在Java中针对于“或”逻辑提供有两类运算符。

img普通“或”逻辑(|):所有的判断条件都执行。

img短路“或”逻辑(||):若干个判断条件如果有判断条件返回了true,那么后续的条件将不再判断,最终的结果就是true。

下面将通过两个程序为读者分析两种“或”逻辑运算的区别。

范例:普通“或”逻辑运算

img

本程序定义了两个判断条件:“1!=2”返回true,“10 / 0==0”产生ArithmeticException算数异常,由于此时使用了普通“或”,则在第一个判断条件返回true后,会继续执行第二个判断条件,此时就产生了异常,而对于此时的程序需要注意,如果第一个判断条件已经返回了true,那么后面不管有多少个false最终的结果就应该为true,则此时可以考虑使用短路“或”逻辑运算。

范例:短路“或”逻辑运算

img

本程序利用了短路“或”逻辑进行了判断,通过执行结果可以发现,第二个判断条件并没有执行。因为短路“或”运算符的执行性能较高,所以建议开发中对于“或”逻辑应该以“||”为主。

2.4.5 位运算符

img

在Java中提供位运算符,该类运算由操作数和位运算符所组成,可以实现对数值类型的二进制数进行运算,在位运算中提供有两类运算符:逻辑运算符(~、&、|、^)、移位运算符(〉〉、〈〈、〉〉〉),如表2-10所示。

表2-10 位运算符

img

在Java中所有的数据都是以二进制数据的形式进行运算的,即如果是一个int型变量,要采用位运算的时候则必须将其变为二进制数据。每一位二进制进行“与”“或”“异或”操作的结果如表2-11所示。

表2-11 位运算的结果

img

提示:十进制转二进制。

十进制数据变为二进制数据的原则为数据除2取余,最后倒着排列,例如,25的二进值为11001,如图2-6所示。但是由于Java的int型数据为32位,所以实际上最终的数据为00000000 00000000 00000000 0011001。

img

图2-6 十进制转二进制

范例:实现位与操作

img

计算分析:

13的二进制:00000000 00000000 00000000 00001101

7的二进制:00000000 00000000 00000000 00000111

“&”结果:00000000 00000000 00000000 00000101 转换为十进制:5

范例:实现位或操作

img

计算分析:

13的二进制:00000000 00000000 00000000 00001101

7的二进制:00000000 00000000 00000000 00000111

“|”结果:00000000 00000000 00000000 00001111 转换为十进制:15

范例:移位操作

img

本程序利用了左移位的操作模式,实现了23计算结果,也就是说利用位运算可以提升程序性能。