逻辑运算符把各个运算的关系表达式连接起来组成一个复杂的逻辑表达式,以判断程序中的表达式是否成立,判断的结果是 true 或 false。

逻辑运算符是对布尔型变量进行运算,其结果也是布尔型,具体如表 1 所示。

表 1 逻辑运算符的用法、含义及实例
运算符用法含义说明实例结果
&&a&&b短路与ab 全为 true 时,计算结果为 true,否则为 false。2>1&&3<4true
||a||b短路或ab 全为 false 时,计算结果为 false,否则为 true。24false
!!a逻辑非a 为 true 时,值为 false,a 为 false 时,值为 true!(2>4)true
|a|b逻辑或ab 全为 false 时,计算结果为 false,否则为 true1>2|3>5false
&a&b逻辑与ab 全为 true时,计算结果为 true,否则为 false1<2&3<5true
  • && 与 & 区别:如果 a 为 false,则不计算 b(因为不论 b 为何值,结果都为 false)
  • || 与 | 区别:如果 a 为 true,则不计算 b(因为不论 b 为何值,结果都为 true)

注意:短路与(&&)和短路或(||)能够采用最优化的计算方式,从而提高效率。在实际编程时,应该优先考虑使用短路与和短路或。

结果为 boolean 型的变量或表达式可以通过逻辑运算符结合成为逻辑表达式。逻辑运算符 &&、|| 和 !按表 2 进行逻辑运算。

表 2 用逻辑运算符进行逻辑运算
aba&&ba||b!a
truetruetruetruefalse
falsetruefalsetruetrue
truefalsefalsetruefalse
falsefalsefalsefalsetrue

逻辑运算符的优先级为:!运算级别最高,&& 运算高于 || 运算。!运算符的优先级高于算术运算符,而 && 和 || 运算则低于关系运算符。结合方向是:逻辑非(单目运算符)具有右结合性,逻辑与和逻辑或(双目运算符)具有左结合性。

下面是一些使用逻辑运算符的示例。

  1. x>0 && x<=100 // 第一行语句
  2. y%4==0 || y%3==0 // 第二行语句
  3. !(x>y) // 第三行语句

其中,第一行语句用于判断 x 的值是否大于 0 且小于或等于 100,只有两个条件同时成立结果才为真(true)。第二行语句用于判断 y 的值是否能被 4 或者 3 整除,只要有一个条件成立,结果就为真(true)。第三行语句先比较 x 和 y,再将比较结果取反,即如果 x 大于 y 成立,则结果为假(false),否则为真(true)。

Java关系运算符

关系运算符(relational operators)也可以称为“比较运算符”,用于用来比较判断两个变量或常量的大小。关系运算符是二元运算符,运算结果是 boolean 型。当运算符对应的关系成立时,运算结果是 true,否则是 false。

关系表达式是由关系运算符连接起来的表达式。关系运算符中“关系”二字的含义是指一个数据与另一个数据之间的关系,这种关系只有成立与不成立两种可能情况,可以用逻辑值来表示,逻辑上的 true 与 false 用数字 1 与 0 来表示。关系成立时表达式的结果为 true(或 1),否则表达式的结果为 false(或 0)。表 1 给出了比较运算符的含义及其实例应用。

表 1 比较运算符的含义及其实例应用
运算符含义说明实例结果
>大于运算符只支持左右两边操作数是数值类型。如果前面变量的值大于后面变量的值, 则返回 true。2>3false
>=大于或等于运算符只支持左右两边操作数是数值类型。如果前面变量的值大于等于后面变量的值, 则返回 true。4>=2true
<小于运算符只支持左右两边操作数是数值类型。如果前面变量的值小于后面变量的值,则返回 true。2<3true
<=小于或等于运算符只支持左右两边操作数是数值类型。如果前面变量的值小于等于后面变量的值, 则返回 true。4<=2false
==相等运算符如果进行比较的两个操作数都是数值类型,无论它们的数据类型是否相同,只要它们的值相等,也都将返回 true。
如果两个操作数都是引用类型,只有当两个引用变量的类型具有父子关系时才可以比较,只要两个引用指向的不是同一个对象就会返回 true。
Java也支持两个 boolean 类型的值进行比较。
4==4
97==’a’
5.0==5
true==false
true
true
true
false
!=不相等运算符如果进行比较的两个操作数都是数值类型,无论它们的数据类型是否相同,只要它们的值不相等,也都将返回 true。
如果两个操作数都是引用类型,只有当两个引用变量的类型具有父子关系时才可以比较,只要两个引用指向的不是同一个对象就会返回 true。
4!=2true

注意点如下所示:

  1. 基本类型的变量、值不能和引用类型的变量、值使用 == 进行比较;boolean 类型的变量、值不能与其他任意类型的变量、值使用 == 进行比较;如果两个引用类型之间没有父子继承关系,那么它们的变量也不能使用 == 进行比较。
  2. == 和 != 可以应用于基本数据类型和引用类型。当用于引用类型比较时,比较的是两个引用是否指向同一个对象,但当时实际开发过程多数情况下,只是比较对象的内容是否相当,不需要比较是否为同一个对象。

关系运算符的优先级为:>、=、<= 具有相同的优先级,并且高于具有相同优先级的 !=、==。关系运算符的优先级高于赋值运算符而低于算术运算符,结合方向是自左向右。

关系表达式通常用于 Java 程序的逻辑判断语句的条件表达式中。使用关系表达式要注意以下几点:

  • 运算符 >=、==、!=、<= 是两个字符构成的一个运算符,用空格从中分开写就会产生语法错误。例如x> =y;是错误的,但是可以写成x >= y;在运算符的两侧增加空格会提高可读性。同样将运算符写反,例如 =>、=<、=! 等形式会产生语法错误。
  • 由于计算机内存放的实数与实际的实数存在着一定的误差,如果对浮点数进行 ==(相等)或 !=(不相等)的比较,容易产生错误结果,应该尽量避免。
  • 不要将“==”写成“=”。

下面是一些使用关系运算符的示例。

  1. a > b // 比较变量a的值是否大于变量b的值
  2. x+y> = z // 比较变量x与变量y的和是否大于或等于变量z的值
  3. width * width+size != area // 比较变量width的平方加上变量size的值是否与变量area的值不相等
  4. name == “zhht” // 比较变量name的值是否等于字符串nzht
  5. pass != “123456” // 比较变量pass的值是否不等于字符串“123456”
例 1

编写一个程序,使用户可以从键盘输入两个数,并判断这两个数之间的大小。 实现代码如下:

  1. public static void main(String[] args) {
  2. int number1, number2; // 定义变量,保存输入的两个数
  3. System.out.print(“请输入第一个整数(number1):”);
  4. Scanner input = new Scanner(System.in);
  5. number1 = input.nextInt(); // 输入第一个数
  6. System.out.print(“请输入第二个整数(number2):”);
  7. input = new Scanner(System.in);
  8. number2 = input.nextInt(); // 输入第二个数
  9. System.out.printf(“number1=%d,number2=%d\n”, number1, number2); // 输出这两个数
  10. // 判断用户输入的两个数是否相等
  11. if (number1 == number2) {
  12. System.out.println(“number1 和 number2 相等。”);
  13. }
  14. // 判断用户输入的两个数据是否相等
  15. if (number1 != number2) {
  16. System.out.println(“number1 和 number2 不相等。”);
  17. // 判断用户输入的数1是否大于数2
  18. if (number1 > number2) {
  19. System.out.println(“number1 大于 number2。”);
  20. }
  21. // 判断用户输入的数1是否小于数2
  22. if (number1 < number2) {
  23. System.out.println(“number1 小于 number2。”);
  24. }
  25. }
  26. }

保存程序并运行,运行结果如下所示:

图 1 运行结果

在本程序中,使用 input.nextInt() 接收用户从键盘输入的两个数,然后通过关系运算符来比较这两个数之间的大小。这里用到了 if 语句,它是一个流程控制语句,将在后面的章节中详细讲解。