逻辑运算符
介绍
逻辑运算符(Logical Operator) 用于操作两个(或一个)布尔类型 的变量、常量或表达式。
Java中的逻辑运算符包括:
运算符 | 中文名称 | 英文名称 |
---|---|---|
&& | 短路与 | short-circuit AND |
& | 与 | AND |
|| | 短路或 | short-circuit OR |
| | 或 | OR |
~ | 非 | NOT |
^ | 异或 | XOR |
运算规则
短路与
短路与(&&) 运算符操作两个布尔型变量、常量或表达式,若两个操作数均为true 就返回true ,否则返回false 。其行为如下表所示:
A | B | 结果 |
---|---|---|
false | false | false |
false | true | false |
true | false | false |
true | true | true |
不短路与
不短路与 与短路与 行为类似。
区别在于:由于当第一个操作数为false 时与运算一定为false ,故短路与(&&) 运算符此时不再计算第二个操作数,而不短路与(&) 仍要计算第二个操作数的值。
短路或
短路或(||) 运算符操作两个布尔型变量、常量或表达式,若两个操作数均为false 就返回false ,否则返回true 。其行为如下表所示:
A | B | 结果 |
---|---|---|
false | false | false |
false | true | true |
true | false | true |
true | true | true |
不短路或
不短路或 与短路或 行为类似。
区别在于:由于当第一个操作数为true 时与运算一定为true ,故短路或(||) 运算符此时不再计算第二个操作数,而不短路或(|) 仍要计算第二个操作数的值。
逻辑非
逻辑非(!) 运算符操作一个布尔型变量、常量或表达式,若操作数为true 则返回false ,否则返回true 。其行为如下表所示:
A | 结果 |
---|---|
false | true |
true | false |
逻辑异或
逻辑异或(^) 运算符操作两个布尔型变量、常量或表达式,当两个操作数相同则返回false,否则返回true。其行为如下表所示:
A | B | 结果 |
---|---|---|
false | false | false |
false | true | true |
true | false | true |
true | true | false |
短路与不短路的区别
当通过第一个表达式的值已经可以判断最终的结果时(如:与运算的第一个值是false,或运算的第一个值是true),短路的运算符将不会再计算第二个表达式的值;而不短路的运算符继续计算。如下面程序所示:
public class Test {
public static void main(String[] args) {
int a = 1;
int b = 1;
// 不短路
if (a++ >= 0 | b++ >= 0) {
// 输出:a: 2 b: 2
System.out.println("a: " + a + " b: " + b);
}
a = 1;
b = 1;
// 短路
if (a++ >= 0 || b++ >= 0) {
// 输出:a: 2 b: 1
System.out.println("a: " + a + " b: " + b);
}
}
}
一般来说,如非需要实现特殊功能,短路的运算符性能和安全性均更高。如下面两行代码,前者可能引发异常 NullPointerException ,而后者不会。
if (obj != null & obj.foo != 0) {...} // 可能引发NullPointerException
if (obj != null && obj.foo != 0) {...} // 安全
应用
1) 判断一个char变量是否为字母
由于字母a-z和A-Z的Unicode编码是连续的,故通过判断该char变量是否在a-z和A-Z区间即可判断其是否为字母,即可使用逻辑表达式:c >= ‘a’ && c <= ‘z’ || c >= ‘A’ && c <= ‘Z’ 。同理,判断char变量是否为数字时,也可以使用类似的表达式:c >= ‘0’ && c <= ‘9’ 。
public class Test {
public static void main(String[] args) {
char c = 'm';
if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') {
System.out.println(c + " 是字母");
} else {
System.out.println(c + " 不是字母");
}
}
}