使用AND和OR进行表达式评估的Java顺序

时间:2013-11-28 17:52:34

标签: java operators expression

    boolean a = false;
    boolean b = false;
    boolean c = false;
    boolean bool = (a = true) || (b = true) && (c = true);
    System.out.println("" + a + b + c);

prceding代码打印truefalsefalse。但是,&&运算符的优先级高于||运算符,应首先进行求值,那么为什么不打印truetruetrue

4 个答案:

答案 0 :(得分:8)

相信你问题的关键在于这一部分:

  

但是,&&运算符的优先级高于||运营商,应首先评估

没有。优先顺序不会影响执行排序。这是有效的包围。所以你的表达式相当于:

boolean bool = (a = true) || ((b = true) && (c = true));

...首先仍然执行a = true。此时,结果肯定是true||正在短路,||的右侧操作数未执行,因此b和{{ 1}}是假的。

来自JLS section 15.7.1

  

在评估右侧操作数的任何部分之前,二元运算符的左侧操作数似乎已完全评估。

优先顺序与此无关。

答案 1 :(得分:3)

||是短路的,所以只有左边的false才会评估它的右侧。

答案 2 :(得分:0)

因为它执行延迟评估。

由于(a = true)返回true,因此永远不会评估(b = true) && (c = true)。因此你得到这样的输出。

答案 3 :(得分:0)

&&和||操作员是“短路的”:如果没有必要,他们不评估右侧。