欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

40.关系与布尔运算符

程序员文章站 2022-04-29 13:01:44
...

1.关系运算符

 

在Java中,提供了完整了关系运算符。Java中,关系运算符包括:>,<,>=,<=,==,!=,用来对两个简单类型操作数进行比较运算,所组成的表达式结果为boolean类型的值true或false。

注意:除了“==”和“!=”外,其他的关系运算符都不能用在boolean类型的操作数中。

 

在这边需要提醒注意的是,在Java中,“不等于”是用“!=”表示的,而不是一些编程语言的“<>”,而等于也是和一些编程语言不一样,它使用“==”而非“=”,在Java中,“=”用于赋值操作,而非关系运算符。


“==”和“!=”除了用于简单类型的操作数外,还可以用于比较引用类型数据。

 

2.布尔运算符

 

布尔运算符也称逻辑运算符,包括:!,&,|,^,&&,||,这些运算符分别实现“非”、“与”、“或”、“异或”、“短路与”、“短路或”等逻辑运算。

 

和关系运算一样,逻辑运算结果也是布尔类型值true或false,Java语言中逻辑运算规则与其它语言中的相近。


在布尔运算符中,需要特别说明的是,短路与“&&”和短路或“||”,这两个运算符是按照“短路”的方式进行求值的,也就是说,如果第一个表达是已经可以判断出整个表达式的值时,就不进行后面的运算了。

 

例如,当对表达式a&&b进行运算时,如果表达式a的值为false,将不对b的值进行计算。而当对表达式a||b进行运算时,如果a 的值为true,将不对b的值进行计算。

 

请看下面的例子。

 

public class ShortCircuit {
 public static void main(String[] agrs) {
  ShortCircuit sc = new ShortCircuit();
  System.out.println("短路或运算");
  System.out.println(sc.Ma() || sc.Mb() || sc.Mc());
  System.out.println("短路与运算");
  System.out.println(sc.Ma() && sc.Mb() && sc.Mc());
 }

 boolean Ma() {
  System.out.println("Ma()被调用!");
  return 1 < 2;// true
 }

 boolean Mb() {
  System.out.println("Mb()被调用!");
  return 1 == 2;// false
 }

 boolean Mc() {
  System.out.println("Mc()被调用!");
  return 1 > 2;// false
 }
}

上面的程序中,因为方法Ma()的值为true,而“或”运算中如果有一个表达式为真(true),则整个表达式均为真(true),因此,无需计算后面方法Mb()和方法Mc()这两个表达式就可以得到整个表达式的值了。

 

而第二条“短路与”语句,因为在逻辑“与”运算中,只需要一个表达式的值为假(false),则整个表达式的值都为假(false)。Ma()为真(true),所以将进行第二个表达式的运算,它将调用方法Mb(),而此时,Mb()方法的返回值为假(false),所以将不用进行后面的运算了。

编译运行上面的程序,将得到如下的输出:
短路或运算
Ma()被调用!
true
短路与运算
Ma()被调用!
Mb()被调用!
false


注意:运算符“&&”和“&”、“||”和“|”所求得的结果是一样的,它们的区别在于,“&”和“|”不会进行“短路”运算,而是会计算运算符两边的各个参数的值。

 

在实际编程中,如无特殊要求,建议均使用短路运算符。

 

因为在实际编程中,如果需要对两个逻辑布尔表达式进行与或运算,第一点,使用短路运算,在可以确认布尔运算结果的情况下,不需对第二个布尔运算进行计算,节省了运算资源时间。更重要的一点,很多时候两个布尔逻辑表达式是相关联的。

 

比如在一个与运算中,第一个布尔运算为true的情况下,再进行第二个布尔运算,从而得到结果是合理的。如果第一个已经是false了,若不是短路运算符的话,仍会执行第二个布尔运算,但实际情况是,第一个运算不通过的话,第二个布尔运算是会发生异常的。

 

看下面的例子。以Student类为例:

 

Student s = null;

 

if(s !=null && s.getAge()>18){

  System.out.println("成年");

}

 

如果不使用短路与,在s为null,最终结果肯定是false的情况下,Java运行仍会执行第二个布尔运算,但是此时s为null,调用null引用对象,会发生空指针引用异常的。

 

但如果使用短路运算,则不会进行第二个布尔运算,就不会发生这种情况了。避免发生难以发觉处理的异常信息。