任何人都可以解释以下代码输出背后的逻辑吗?
if(true||false&&false){
System.out.println("right to left ");
}
if (false && true||true){
System.out.println("left to right");
}
任何人都可以解释以下代码输出背后的逻辑吗?
if(true||false&&false){
System.out.println("right to left ");
}
if (false && true||true){
System.out.println("left to right");
}
如果您查看此运算符优先级表,您会发现它&&
的优先级高于||
.
因此,这两个表达式的计算方式如下:
true || false && false
== true || (false && false)
==true
false && true || true
== (false && true) || true
==true
&&
Java 为and赋予了不同的运算符优先级||
。这意味着你的表达式可以写成true || (false && false)
and (false && true) || true
。当您在布尔表达式中看到“或真”时,它始终为真。这就是打印两个字符串的原因。
如果你想让你的表达清楚,你总是可以在x && y
零件周围加上括号。
if(true||false&&false)
可以简化为 true 以便打印该行。它可以简化为 true,因为您true
在左侧有 a 。由于它||
的右侧有一个或/,并且事情已经是真实的,这意味着它可以短路而不评估其余部分。您可以通过获取false&&false
,将其放入自己的方法中,然后在返回之前打印一行来向自己证明这一点。你会看到它没有打印出来。那是因为(false && false)
甚至没有评估。
false && true||true
可以简化为 true 以便打印该行。thefalse && true
评估为假,但由于有一个 or 剩余,它评估它的另一面。事实证明这是真的。因为false||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;
}
首先,如果在编译时消除这种情况,只要结果是不变的。
||(或) - 加法
&&(and) - 乘法
这就是为什么 && 的优先级高于 ||
所以按优先级表达式等于:
true + (false * false)
和(false * true) + true