「Java基础」逻辑运算符及应用

逻辑运算符

介绍

逻辑运算符(Logical Operator) 用于操作两个(或一个)布尔类型 的变量、常量或表达式。

Java中的逻辑运算符包括:

运算符中文名称英文名称
&&短路与short-circuit AND
&AND
||短路或short-circuit OR
|OR
~NOT
^异或XOR

运算规则

短路与

短路与(&&) 运算符操作两个布尔型变量、常量或表达式,若两个操作数均为true 就返回true ,否则返回false 。其行为如下表所示:

AB结果
falsefalsefalse
falsetruefalse
truefalsefalse
truetruetrue

不短路与

不短路与短路与 行为类似。
区别在于:由于当第一个操作数为false 时与运算一定为false ,故短路与(&&) 运算符此时不再计算第二个操作数,而不短路与(&) 仍要计算第二个操作数的值。

短路或

短路或(||) 运算符操作两个布尔型变量、常量或表达式,若两个操作数均为false 就返回false ,否则返回true 。其行为如下表所示:

AB结果
falsefalsefalse
falsetruetrue
truefalsetrue
truetruetrue

不短路或

不短路或短路或 行为类似。
区别在于:由于当第一个操作数为true 时与运算一定为true ,故短路或(||) 运算符此时不再计算第二个操作数,而不短路或(|) 仍要计算第二个操作数的值。

逻辑非

逻辑非(!) 运算符操作一个布尔型变量、常量或表达式,若操作数为true 则返回false ,否则返回true 。其行为如下表所示:

A结果
falsetrue
truefalse

逻辑异或

逻辑异或(^) 运算符操作两个布尔型变量、常量或表达式,当两个操作数相同则返回false,否则返回true。其行为如下表所示:

AB结果
falsefalsefalse
falsetruetrue
truefalsetrue
truetruefalse

短路与不短路的区别

当通过第一个表达式的值已经可以判断最终的结果时(如:与运算的第一个值是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 + " 不是字母");
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值