java中给定的if条件如何为true
我无法理解为什么执行以下if块。如何评估if条件java中给定的if条件如何为true,java,if-statement,conditional,Java,If Statement,Conditional,我无法理解为什么执行以下if块。如何评估if条件 public class Test { public static void main(String[] args) { if (true || (false || true) && false) { System.out.println("How does this condition becomes true."); }
public class Test
{
public static void main(String[] args)
{
if (true || (false || true) && false)
{
System.out.println("How does this condition becomes true.");
}
if (false && (false || true) || true)
{
System.out.println("Same with this condition, why is it true.");
}
}
}
&&
的优先级高于|
()。因此,加入Paren以强调如何评估这些因素:
if (true || ((false || true) && false))
// -------------^-------------------------^
及
正如您所看到的,您最终得到了x | | y
,其中x
在第一个示例中为true
,而y
在第二个示例中为true。自然地,true | | false
和false | | true
都是true
您可以通过使用一个输出它正在执行的操作()的方法来查看它的运行情况(请记住,|
和&&
都存在短路,这意味着它们不会计算无法更改结果的操作数):
运行时,输出:
1: true
How does this condition becomes true.
5: false
8: true
Same with this condition, why is it true.
1:对
这种情况是如何变为现实的。
5:错
8:对
和这个条件一样,为什么是真的。
我们来看看第一行:
if (true || (false || true) && false)
根据优先级,将首先评估()
之间的所有内容。因此,这将是假| |真
,我们可以将| |
写成或,这意味着我们得到真或假
,在这种情况下它将是真
,因为这两个值之一是真
好的,让我们继续,它变成这样:
if (true || true && false)
现在我们来谈谈你困惑的部分。在这种情况下,我们不从左到右阅读。我们需要先看一下&
,而不是|
。因此,我们需要检查true&&false
求值,它将变成false
:
然后,我们只剩下以下陈述:
if (true || false)
当然,这将变成true
。第二种情况也是如此
请看这里的mor:首先,您必须已经知道false | | true
是true
除此之外,你还需要知道另外两件事:
&&和| |操作符“短路”,这意味着如果没有必要,他们不会对右侧进行评估
当同等优先级的运算符出现在同一表达式中时,必须有一条规则来控制首先求值的运算符。除赋值运算符外,所有二进制运算符都从左向右求值;赋值运算符从右向左求值
从优先级表中,我们知道&
高于|
所以在你的问题中,让我们做基本的推理
if(真| | | | |真&&false)
true | | |不管什么东西在右侧
都是true
,所以我们得到了一个true
if(假&(假| |真)| |真)
这一个比前面更棘手,这次我们必须考虑<强>恼人< /强>优先。我们的推理如下:
false&不管右侧是什么
都将是false
,剩下的就是:
false || true
最后,我们又得到了true
但是如果您已经注意到了技巧:我们从最右边的开始true
,然后我们可以进行推理,因为前面的推理直接得到true
正如Michael提到的,我们最好使用括号来表示确切的顺序,而不是依赖于优先级,这实际上很难记住 使用|
如果至少有一个操作数为真,则条件为真。例如,false | | true
会导致true
第一个条件为true,因为第一个true(true | |…
)
if (true || (false || true) && false)
......|...............................
第二个条件为true,因为最后一个true。| | true)
请看下面的图片
请参考这个值得注意的链接:即使您知道优先级规则(很多Java开发人员都不知道),如果包含括号,那么快速找出逻辑几乎总是比较容易的。它还向读者传达了你的确切意图——当一位同事编写表达式时,我试图推断他是否理解优先规则的次数甚至都不好笑。@Michael,你在条件中使用括号的说法是正确的,当我发现这一点时,我正在研究一些遗留代码。因为我不知道运算符优先级规则,所以我无法弄清楚它是如何工作的。很抱歉,我们在这里不做math
,因为逻辑运算中存在短路
false || true
if (true || (false || true) && false)
......|...............................
if (false && (false || true) || true)
...................................|..
OR
P Q P||Q
--------------------
T F T
F T T
T T T
F F F