有人可以解释下面代码输出背后的逻辑吗?
if(true||false&&false){
System.out.println("right to left ");
}
if (false && true||true){
System.out.println("left to right");
}
答案 0 :(得分:5)
如果您查看this Operator precedence table,可以看出&&
的优先级高于||
。
因此,这两个表达式的评估如下:
true || false && false
== true || (false && false)
== true
false && true || true
== (false && true) || true
== true
答案 1 :(得分:1)
if(true||false&&false)
可以简化为true,因此可以打印该行。它可以简化为true,因为左侧有true
。由于它右侧有一个或/ ||
,事情已经成立,这意味着它可以短路而不评估其余部分。您可以通过取false&&false
,将其放入自己的方法,然后在返回之前打印一行来证明这一点。你会看到它不打印。那是因为(false && false)
甚至没有被评估过。
false && true||true
可以简化为true,因此可以打印该行。 false && true
的计算结果为false,但由于存在或遗留,它会评估其他方面。事实证明这是真的。自false||true
== true
以来,评估为true。这里没有短路。您可以通过将false && true
提取到自己的方法并在第一行打印一些内容来证明这一点。你会看到它打印出来:
public static void main(String args[]) {
if(true|| doSomething()){
System.out.println("right to left ");
}
if (doSomethingElse() ||true){
System.out.println("left to right");
}
}
private static boolean doSomething() {
System.out.println("do something"); //this does NOT print
return false&&false;
}
private static boolean doSomethingElse() {
System.out.println("do something else"); //this DOES print
return false && true;
}
答案 2 :(得分:1)
Java为&&
和||
提供了不同的运算符优先级。这意味着您的表达式可以写为true || (false && false)
和(false && true) || true
。当您在布尔表达式中看到“或true”时,它始终为true。这就是打印两个字符串的原因。
如果您希望表达清晰明了,可以随时在x && y
部分放置括号。
答案 3 :(得分:0)
首先,如果在编译时消除了这些情况,只要结果是恒定的。
||(或) - 添加
&&(和) - 乘法
这就是为什么&&优先级高于||
因此,优先级表达式等于:
true + (false * false)
和(false * true) + true