有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java逻辑运算符短路

哪个集合是短路,复杂条件表达式是短路的确切含义是什么

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);

}

共 (6) 个答案

  1. # 1 楼答案

    &&||操作符“短路”,这意味着如果没有必要,它们不会计算右侧

    &|运算符用作逻辑运算符时,总是对两边求值

    每个操作员只有一种短路情况,它们是:

    • 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;
    }
    

    第二个版本使用非短路运算符&,如果inputnull,则将抛出NullPointerException,但第1个版本将毫无例外地返回false

  2. # 2 楼答案

    集合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)
    
  3. # 3 楼答案

    Java提供了在大多数其他计算机语言中找不到的两个有趣的布尔运算符。AND和OR的这些二级版本称为短路逻辑运算符。从上表可以看出,当A为true时,OR运算符的结果为true,而不管B是什么

    类似地,当A为false时,AND运算符会导致false,而不管B是什么。如果使用||&&形式,而不是这些运算符的|&形式,Java将不会费心单独计算右侧操作数。当右操作数依赖于左操作数为真或假以正常工作时,这非常有用

    例如,以下代码片段显示了如何利用短路逻辑求值来确保除法运算在求值之前有效:

    if ( denom != 0 && num / denom >10)
    

    由于使用了AND(&&)的短路形式,因此不存在导致运行时异常除以零的风险。如果这行代码是使用AND的单个&版本编写的,则必须对两侧进行求值,从而在denom为零时导致运行时异常

    标准做法是在涉及布尔逻辑的情况下使用AND和OR的短路形式,将单字符版本仅用于按位操作。然而,这条规则也有例外。例如,考虑下面的语句:

     if ( c==1 & e++ < 100 ) d = 100;
    

    这里,使用单个&可以确保无论c是否等于1,增量操作都将应用于e

  4. # 4 楼答案

    boolean a = (x < z) && (x == x);
    

    这种类型将短路,这意味着如果(x < z)的计算结果为false,则后者不计算,a将为false,否则&&也将计算(x == x)

    &是一个按位运算符,但也是一个不短路的布尔AND运算符

    您可以通过以下方式对它们进行测试(查看在每种情况下调用该方法的次数):

    public static boolean getFalse() {
        System.out.println("Method");
        return false;
    }
    
    public static void main(String[] args) {
        if(getFalse() && getFalse()) { }        
        System.out.println("=============================");        
        if(getFalse() & getFalse()) { }
    }
    
  5. # 5 楼答案

    简单地说,短路意味着一旦知道答案不能再改变,就停止评估。例如,如果您正在评估逻辑链^ {< CD1> }s,并且在该链的中间发现一个^ {CD2}},则知道结果将是假的,不管该链中其余表达式的值是什么。对于OR链也是如此:一旦发现了一个TRUE,您就会立即知道答案,因此可以跳过对其余表达式的求值

    您可以通过使用&&而不是&||而不是|来向Java指示您想要短路。你文章中的第一组是短路

    请注意,这不仅仅是为了节省几个CPU周期:在这样的表达式中

    if (mystring != null && mystring.indexOf('+') > 0) {
        ...
    }
    

    短路意味着正确操作和崩溃之间的差异(在mystring为null的情况下)

  6. # 6 楼答案

    短路意味着如果第一个操作员决定最终结果,则不会检查第二个操作员

    表达式是:真| |假

    在| |的情况下,我们所需要的只是其中一方为真。因此,如果左侧为真,则检查右侧没有意义,因此根本不会检查右侧

    同样,False&&;真的

    如有,&;,我们需要双方都做到这一点。因此,如果左侧为假,那么检查右侧没有意义,答案必须为假。因此,这一点根本不会被检查