&&
的优先级应高于||
:
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)
因此,如果第一个评估为真,则它会短路。谢谢你的帮助。
答案 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.