&&,&为什么输出不同?

这是代码段

你能解释为什么产出会变化吗?

1)

public static ShortCkt {
    public static void main(String args[]) {
        int i = 0;
        boolean t = true;
        boolean f = false, b;
        b = (t && ((i++) == 0));
        b = (f && ((i+=2) > 0));
        System.out.println(i);      
    }
}

这种情况下的输出是1

2)

public static ShortCkt {
    public static void main(String args[]) {
        int i = 0;
        boolean t = true;
        boolean f = false, b;
        b = (t & ((i++) == 0));
        b = (f & ((i+=2) > 0));
        System.out.println(i);      
    }
}

这种情况下的输出是3

3)

public static ShortCkt {
    public static void main(String args[]) {
        int i = 0;
        boolean t = true;
        boolean f = false, b;
        b = (t || ((i++) == 0));
        b = (f || ((i+=2) > 0));
        System.out.println(i);      
    }
}

这种情况下的输出是2

4)

public static ShortCkt {
    public static void main(String args[]) {
        int i = 0;
        boolean t = true;
        boolean f = false, b;
        b = (t | ((i++) == 0));
        b = (f | ((i+=2) > 0));
        System.out.println(i);      
    }
}

这种情况下的输出是3


为什么在&&,&,||的情况下输出是不同的 ?

就像在C / C ++ &&中评估的“懒惰”而&不是。

如果a是假的,那么a && b将返回false而不评估b

a || b同样适用a || b a || b :如果第一个操作数a为真,则整个表达式为真,并且第二个操作数b永远不会被评估。 对于a | b a | b然而, ab都会被评估。

如果在使用&& (或|| )时未评估的操作数具有副作用,则会产生后果,如示例中所示。


附注:很少有java程序员知道^ (xor)也适用于布尔值。 (A ^^版本不存在只是因为它是多余的。)


有4个boolean二进制运算符我们在这里关注:

  • &&是条件操作符
  • &是逻辑和操作符
  • || 是条件操作符或操作符
  • | 是逻辑还是操作符
  • 关键是:

  • “条件”意味着它短路:如果它不影响操作结果,它不评估正确的操作数
  • “逻辑”不会短路:它评估两个操作数,先左边,右边。
  • 只有两个操作数都为true ,“和”的结果才是true
  • 如果左操作数为false ,则无论右操作数如何,结果都为false
  • 结果“或”是true只有当至少一个操作数是true
  • 如果左操作数为true ,则无论右操作数如何,结果都为true
  • 换句话说,假设没有例外等:

  • &| 总是评估两个操作数
  • &&|| 有条件地评估正确的操作数; 只有在其值可能影响二进制操作的结果时才评估右操作数。 这意味着在下列情况下不会评估右操作数:
  • &&的左操作数评估为false
  • (因为不管操作数的合理性如何,整个表达式都是false
  • ||的左操作数 评估为true
  • (因为不管操作数的合理性如何,整个表达式都是true
  • 参考

  • JLS 15.22.2布尔逻辑运算符&^|
  • 对于& ,结果值是true如果两个操作数的值是true ; 否则,结果是false
  • | 时,结果值是false如果两个操作数的值是false ; 否则,结果是true
  • JLS 15.23条件与操作符&&
  • &&运算符与&相似,但只有在其左侧操作数的值为true才会评估其右侧操作数。
  • JLS 15.24 15.24条件或运算符||
  • || 运算符就像| ,但只有在其左侧操作数的值为false时才评估其右侧操作数。
  • 也可以看看

  • JLS 15.22.1整数位运算符&^|
  • 相关问题

  • |什么区别? 和|| 在Java中?
  • 在Java中执行&=|=短路吗? (没有!)
  • Java中的快捷方式“or-assignment”( |= )运算符
  • 为什么Java没有&&=||=

  • &&|| 是逻辑AND和OR运算符,它们总是导致boolean表达式。 &| 是按位AND和OR操作符,它们对每一边进行按位比较。 有关这些运营商的更多信息,请参阅此链接

    链接地址: http://www.djcxy.com/p/73913.html

    上一篇: Why is the output different in case of &&, &,

    下一篇: Do &= and