3.7.6 逻辑运算符

3.7.6 逻辑运算符

逻辑运算符用于操作两个布尔型的变量或常量。逻辑运算符主要有如下6个。

逻辑运算符 描述
&& 短路与,前后两个操作数必须都是true才返回true,否则返回false,如果第一个操作数为false则直接返回false,不计算第二个操作数
`
& 不短路与,作用与&&相同,但不会短路。两个操作数都会计算
` `
! ,只需要一个操作数,如果操作数为true,则返回false
^ 异或,当两个操作数不同时才返回true,如果两个操作数相同则返回false

程序示例 逻辑运算符

下面代码示范了或、与、非、异或4个逻辑运算符的执行示意。

1
2
3
4
5
6
7
8
// 直接对false求非运算,将返回true
System.out.println(!false);
// 5>3返回true,'6'转换为整数54,'6'>10返回true,求与后返回true
System.out.println(5 > 3 && '6' > 10);
// 4>=5返回false,'c'>'a'返回true。求或后返回true
System.out.println(4 >= 5 || 'c' > 'a');
// 4>=5返回false,'c'>'a'返回true。两个不同的操作数求异或返回true
System.out.println(4 >= 5 ^ 'c' > 'a');

短路或和不短路或的区别

1
2
3
4
5
6
7
8
// 定义变量a,b,并为两个变量赋值
int a = 5;
int b = 10;
// 对a > 4和b++ > 10求或运算
if (a > 4 | b++ > 10) {
// 输出a的值是5,b的值是11。
System.out.println("a的值是:" + a + ",b的值是:" + b);
}

执行上面程序,看到输出a的值为5,b的值为11,这表明b++ > 10表达式得到了计算,但实际上没有计算的必要,因为a>4已经返回了true,则整个表达式一定返回true
再看如下代码,只是将上面示例的不短路逻辑或改成了短路逻辑或

1
2
3
4
5
6
7
8
// 定义变量c,d,并为两个变量赋值
int c = 5;
int d = 10;
// c > 4 || d++ > 10求或运算
if (c > 4 || d++ > 10) {
// 输出c的值是5,d的值是10。
System.out.println("c的值是:" + c + ",d的值是:" + d);
}

上面代码执行的结果是:c的值为5,而d的值为10。
对比两段代码,后面的代码仅仅将不短路或改成短路或,程序最后输出的d值不再是11,这表明表达式d++>10没有获得执行的机会。
因为对于短路逻辑或而言,如果第一个操作数返回true,短路逻辑或将不再对第二个操作数求值,直接返回true。也就是不会计算d++>10这个逻辑表达式,因而d++没有获得执行的机会。因此,最后输出的d值为10。而不短路或总是执行前后两个操作数

短路与和不短路与的区别

&&与&的区别与此类似:

  • &总会计算前后两个操作数,
  • &&先计算左边的操作数,如果左边的操作数为false,则直接返回false,根本不会计算右边的操作数。