Java逻辑运算符短路

Aar*_*ron 90 java logical-operators

哪一组是短路的,这究竟是什么意味着复杂的条件表达式是短路的?

public static void main(String[] args) {
  int x, y, z;

  x = 10;
  y = 20;
  z = 30;

  // T T
  // T F
  // F T
  // F F

  //SET A
  boolean a = (x < z) && (x == x);
  boolean b = (x < z) && (x == z);
  boolean c = (x == z) && (x < z);
  boolean d = (x == z) && (x > z);
  //SET B    
  boolean aa = (x < z) & (x == x);
  boolean bb = (x < z) & (x == z);
  boolean cc = (x == z) & (x < z);
  boolean dd = (x == z) & (x > z);

}
Run Code Online (Sandbox Code Playgroud)

Boh*_*ian 226

&&||运营商"短路",这意味着如果没有必要,他们不评价的右手边.

&|运营商,如逻辑运算符时,始终评估两侧.

每个运营商只有一个短路案例,它们是:

  • false && ... - 没有必要知道右手边是什么,结果必须是 false
  • true || ... - 没有必要知道右手边是什么,结果必须是 true

让我们在一个简单的例子中比较行为:

public boolean longerThan(String input, int length) {
    return input != null && input.length() > length;
}

public boolean longerThan(String input, int length) {
    return input != null & input.length() > length;
}
Run Code Online (Sandbox Code Playgroud)

第二个版本使用非短路运营商&,并抛出一个NullPointerException如果inputnull,但是第一个版本将返回false无异常;

  • 有一点我想强调一下,| 和&是二元运算符,而&&和|| 是条件(逻辑)运算符.| &&和&不仅仅​​是布尔,而且&&和|| 只适用于布尔人. (9认同)
  • 我只想稍微扩展一下这个答案.&=运算符是x = x&expression的简写,因此不会短路.| =运算符也是如此. (6认同)
  • 它们不仅不计算右侧的表达式,而且不会执行代码,因为有任何需要计算的内容。这是理解是否会产生副作用的关键点。 (2认同)

afr*_*hke 9

SET A使用短路布尔运算符.

在布尔运算符的上下文中,"短路"意味着对于一组布尔值b1,b2,...,bn,只要第一个布尔值为真,短路版本就会停止评估(|| )或假(&&).

例如:

// 2 == 2 will never get evaluated because it is already clear from evaluating
// 1 != 1 that the result will be false.
(1 != 1) && (2 == 2)

// 2 != 2 will never get evaluated because it is already clear from evaluating
// 1 == 1 that the result will be true.
(1 == 1) || (2 != 2)
Run Code Online (Sandbox Code Playgroud)

  • 事实上,为了真正完整,所有 `&amp;&amp;`、`||`、`&amp;` 和 `|` 从左到右评估。对于一组布尔值 b1、b2、...、bn,当这些布尔值中的第一个为 true (`||`) 或 false (`&amp;&amp;`) 时,短路版本将停止计算。呸,原理就在那里;) (2认同)