java boolean的优先级

时间:2014-08-28 13:06:32

标签: java boolean

&&的优先级应高于||

    int a = 10;
    System.out.println(a==10 || --a==9 && a==8);
    System.out.println(a);

这打印为true,和10.它似乎只检查第一部分,如果它是真的,则第二部分永远不会执行。

如果我a==9,那么第二部分似乎评估和打印9.有人可以解释为什么会这样吗?是不是应该先&&进行评估?

编辑:我明白了。 a==10 || --a==9 && a==8转换为(a==10) || (a==9 && a==8)因此,如果第一个评估为真,则它会短路。谢谢你的帮助。

5 个答案:

答案 0 :(得分:4)

System.out.println(a==10 ||  --a==9 && a==8);

等于

System.out.println((a==10) ||  (((--a)==9) && (a==8)));

Java首先评估||。找出左边的部分(a == 10)是true并得出无论正确的部分结果是什么,true

PS :这是写

的常用技巧
if(obj != null && obj.isSomething) { ... }

防止 NPE

答案 1 :(得分:3)

如果您评估(a==10) || (b == 9)(这是OR操作), 如果第一个子句是true,那么整个表达式必须是true(因为它是“或”),并且出于优化的原因不会执行第二个子句。

代码从左到右执行,因此您将点击第一个TRUE,因此您的整个语句将为TRUE,并且您的语句的其余部分将不会被执行

如果您的第一个子句是false,那么只会评估第二个子句。

如果使用(a==10) | (b == 9),将评估两个条款。

如果您想确定运算符的优先级,则应使用括号

答案 2 :(得分:3)

将表达式看作树是很有用的。

a==10 ||  --a==9 && a==8

在此示例中,树的顶部是OR。左分支是EQUALS,右分支是AND,其左右分支都是EQUALS。

由于我对图形很糟糕,它看起来像是:

    OR
   /   \-----
  =          \
 / \         AND
a  10       /   \
           =     =
          / \   / \
       --a   9 a   8

您正在谈论的“优先级”,命令此树。但它并不一定会改变执行顺序。因为在这种情况下,如果第一个分支为真,则为真,因此不需要检查第二个分支。

答案 3 :(得分:2)

在这种情况下,它与更高的优先级没有任何关系。查看懒惰的评价。操作将从左到右进行评估,并发现a==10为真并停在那里。

根据评估顺序查看http://introcs.cs.princeton.edu/java/11precedence/中的评论

答案 4 :(得分:0)

 || and && are short circuit operators they don't evaluate the right hand side expression 
 if the left hand side is true.
 So (--a) is never executed as (a==10) left hand side is true
 Therefore the value of a remains same.
 **& and | operators that always evaluate both sides.