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

Ank*_*han 6 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);      
    }
}
Run Code Online (Sandbox Code Playgroud)

这种情况下的输出为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);      
    }
}
Run Code Online (Sandbox Code Playgroud)

这种情况下的输出是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);      
    }
}
Run Code Online (Sandbox Code Playgroud)

这种情况下的输出是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);      
    }
}
Run Code Online (Sandbox Code Playgroud)

这种情况下的输出是3

aio*_*obe 12

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

就像在C/C++ &&中一样,"lazily"被评估,而&不是.

如果a为false则a && b返回false而不进行评估b.

同样a || b如下:如果第一个操作数a为true,则整个表达式为true,b并且永远不会计算第二个操作数.对于a | b然而,无论是ab进行评估.

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


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


pol*_*nts 7

boolean我们关注的是4个二元运算符:

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

这是关键点:

  • "条件"表示它是短路的:它不会评估右操作数,如果它不会影响操作的结果
  • "逻辑"不会短路:它会评估两个操作数,先左,然后右.
  • "和"的结果true仅在两个操作数均为时true
    • 如果左操作数是false,则结果false与右操作数无关
  • "或"的结果true仅在至少有一个操作数的情况下true
    • 如果左操作数是true,则结果true与右操作数无关

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

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

参考

也可以看看

相关问题