Java 中的逻辑运算符

2025年4月11日 | 阅读 7 分钟

在 Java 中,逻辑运算符用于对布尔表达式执行逻辑运算。它们通常会评估表达式的两侧。Java 中有三种逻辑 运算符

  1. 逻辑与 (&&)
  2. 逻辑或 (||)
  3. 逻辑非 (!)
运算符运算符名称示例描述
&&逻辑与a&&b要使结果为真,两个条件都必须为真。
||逻辑或a||b要使结果为真,至少一个条件必须为真。
!一元逻辑非!a否定布尔值。

逻辑与 (&&) 运算符

当两个操作数都为真时,AND 运算符返回 true。否则,它返回 false。借助下表,我们可以计算逻辑 AND 运算符的输出。

我们从表中可以看出,如果两个操作数都为真,则返回 true,否则返回 false。

逻辑与运算符的真值表

ABA && B
TTT
FTF
TFF
FFF

逻辑与运算符示例

示例

编译并运行

输出

true

在上面的示例中,AND 运算符返回 false,因为条件 y < 10 为 false。

逻辑或 (||) 运算符

当至少一个操作数为真时,OR 运算符返回 true。否则,它返回 false。

逻辑或运算符的真值表

ABA || B
TTT
FTT
TFT
FFF

逻辑或运算符示例

示例

编译并运行

输出

true

在上面的示例中,OR 运算符返回 true,因为条件 x > 3 为 true,而条件 y < 10 为 false。因此,结果为 true。

逻辑非 (!) 运算符

逻辑 NOT 运算符用于反转布尔表达式的值。如果表达式为 true,则 NOT 运算符返回 false;如果表达式为 false,则 NOT 运算符返回 true。

逻辑非运算符的真值表

A!A
TF
FT

逻辑非运算符示例

示例

编译并运行

输出

false

逻辑运算符也可以与非布尔表达式一起使用,但首先,它们将根据以下规则转换为布尔值:

  • 任何非零数值都被视为 true。
  • 布尔值 true 被视为 true。
  • 布尔值 false 被视为 false。
  • 任何 null 引用都被视为 false。

例如,以下代码片段打印“至少有一个值为非零”。

在这种情况下,x 为 0,被视为 false,但 y 为 7,被视为 true,因此 OR 运算符返回 true。第三,可以使用括号将逻辑运算符组合成更复杂的表达式,以控制求值顺序。例如,以下代码将打印“两个条件都为真”。

在这种情况下,首先求值表达式 (x > 3 && y < 10),因为两个条件都为真,所以返回 true。然后,求值表达式 (z == 3 && x <= 5),因为 x 大于 5,所以返回 false。

最后,OR 运算符将两个结果组合起来,返回 true,因为至少有一个表达式为 true。总而言之,逻辑运算符是操作布尔值和在 Java 程序中做出决策的强大工具。了解它们的行为以及如何在复杂表达式中有效地使用它们非常重要。

短路求值: Java 的逻辑运算符支持短路求值,这意味着如果可以通过仅求值表达式的一部分来确定表达式的结果,则不会对表达式的其余部分进行求值。这可以提高性能并防止错误。例如,考虑以下代码片段。

在这种情况下,如果 str 为 null,则第一个条件 str != null 为 false,第二个条件 str.length() > 0 将不会被求值,因为整个表达式将已经为 false。这可以防止在尝试访问 null 字符串的长度时抛出 NullPointerException。

位运算符: Java 还有位运算符,用于操作整数值的位。这些运算符包括 AND (&)、OR (|)、XOR (^)、NOT (~)、左移 (<<) 和右移 (>>)。位运算符不是逻辑运算符,因为它们操作的是整数值而不是布尔值。例如,以下代码片段打印 3。

在这种情况下,x 和 y 的二进制表示分别为 101 和 110。位 AND 运算符将比较 x 和 y 的相应位,如果两个位都为 1,则将结果的每一位设置为 1。结果为 100,表示十进制值 4。

优先级: 像算术运算符一样,逻辑运算符也有优先级,它决定了它们的求值顺序。NOT 运算符的优先级最高,然后是 AND,接着是 OR。可以使用括号覆盖默认优先级并控制求值顺序。例如,以下代码将打印“false”。

在这种情况下,首先求值括号内的表达式,因为 x 不等于 6,所以返回 false。然后,将 NOT 运算符应用于结果,将其反转为 true。

三元运算符: Java 还有一个三元运算符 (? :),它可以作为 if-else 语句的简写。三元运算符接受三个操作数:一个布尔表达式,如果表达式为 true 则返回的值,以及如果表达式为 false 则返回的值。例如,以下代码片段打印“x 大于 y”。

在这种情况下,布尔表达式 x > y 为 true,因此返回三元运算符的第一个操作数,即字符串“x is greater than y”。

德摩根定律: 德摩根定律是一组描述如何否定复杂布尔表达式的规则。在 Java 中,德摩根定律可用于简化涉及逻辑运算符的表达式。第一条定律指出,合取(AND)的否定是析取(OR)的否定。换句话说,!(A && B) 等价于 !A || !B。例如,以下代码将打印“x 不等于 3 且 y 不等于 4”。

在这种情况下,表达式 x == 3 || y == 4 求值为 false,因为两个条件都不为真。然后,将 NOT 运算符应用于结果,根据德摩根定律,整个表达式为 true。

逻辑赋值运算符: Java 还有逻辑赋值运算符,它们将逻辑运算符与赋值运算符结合起来。逻辑赋值运算符包括 AND (&=)、OR (|=) 和 XOR (^=)。这些运算符将逻辑运算符应用于左侧操作数和右侧操作数,然后将结果赋给左侧操作数。例如,以下代码将打印“x 现在是 7”。

在这种情况下,OR 运算符应用于 x 和值 2,将 x 的第二位设置为 1。结果是 7,它被重新赋给 x。

相等和关系运算符: 除了逻辑运算符,Java 还有相等和关系运算符,可用于比较值。相等运算符包括 ==(等于)和 !=(不等于),而关系运算符包括 <(小于)、>(大于)、<=(小于等于)和 >=(大于等于)。例如,以下代码片段打印“x 大于 y”。

在这种情况下,使用关系运算符 > 来比较 x 和 y,表达式为 true,因为 x 大于 y。

Java 中逻辑运算符的优点

  • 逻辑运算符通过简洁地说明困难的情况来提高代码的可读性,从而帮助开发人员理解。
  • 通过更容易地通过系统评估来识别有问题的条件,它们加快了调试过程。
  • 逻辑运算符鼓励程序部分之间的代码重用,还减少了冗余并提高了开发效率。
  • 它们允许开发自适应的代码结构,这些结构可以用于各种情况,并允许动态响应程序的输入。

Java 中逻辑运算符的缺点

  • 为了避免混淆并阐明目的,当表达式中的隐含求值顺序产生歧义时,必须显式使用括号。
  • 逻辑运算符的表达能力不如 if-else 和 switch-case 表达式等更复杂的结构,这使得创建复杂条件变得困难。
  • 如果仍然需要处理具有副作用的正确操作数,短路求值可能导致代码执行优化过程中出现意外错误。
  • 将非布尔值与逻辑运算符一起使用可能导致意外行为,偏离程序员的预期推理。