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

时间:2010-08-09 12:27:01

标签: java operators

以下是代码段

你能解释为什么输出变化

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

5 个答案:

答案 0 :(得分:12)

  

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

正如在C / C ++中&&被评估为“懒惰”,而&则不是。{/ p>

如果a为false,则a && b将返回false,甚至不评估b

同样适用于a || b:如果第一个操作数a为真,则整个表达式为真,并且永远不会计算第二个操作数b。但是,对于a | b,我们将评估ab

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


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

答案 1 :(得分:7)

我们在这里关注了4个boolean二元运算符:

  • &&是条件和运算符
    • &是逻辑和运算符
  • ||是条件或运算符
    • |是逻辑或运算符

这是关键点:

  • “条件”表示它短路:如果不影响操作结果,它不会评估右操作数
  • “逻辑”不会短路:它会评估两个操作数,先左,然后右。
  • 仅当两个操作数均为true时,“和”的结果才为true
    • 如果左操作数为false,则无论右操作数为何,结果为false
  • 仅当至少有一个操作数为true时,“或”的结果为true
    • 如果左操作数为true,则无论右操作数为何,结果为true

换句话说,假设没有异常等:

  • &| 始终评估两个操作数
  • &&||有条件地评估右操作数 ;只有当其值可能影响二进制操作的结果时,才会评估右操作数。这意味着在以下情况下不评估右操作数:
    • &&的左操作数评估为false
      • (因为无论右操作数的评估结果如何,整个表达式都是false
    • ||的左操作数评估为true
      • (因为无论右操作数的评估结果如何,整个表达式都是true

参考

另见

相关问题

答案 2 :(得分:1)

&&||是逻辑AND和OR运算符,它们始终生成boolean表达式。 &|是按位AND和OR运算符,它们对每一方进行逐位比较。有关这些运营商的更多信息,请参阅this link

答案 3 :(得分:1)

这是因为&&和||是逻辑运算符,是“短循环机制”。如果你使用||并且第一个表达式的计算结果为true,第二个表达式不会被评估,因此我不会被过时。 &安培;和|是按位运算符,它对输入进行位计算。这些没有短路,因此无论如何都会评估整个表达式。

答案 4 :(得分:1)

&|运算符是按位的,因此必须在运算符可以使用之前对表达式的两边进行求值,因此在情况2和4中,运算符的两边都是总是评估。

情况1和3之间的区别基于短路逻辑。

在案例1中,第二个表达式中的&&运算符在第一个false上短路为false,导致表达式的后半部分不被评估。

在案例3中,第二个表达式的前半部分中的false导致对表达式后半部分的评估,递增i。如果false || expr也为假,则false只能是expr。因此必须对其进行评估。