java中给定的if条件如何为true

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."); }

我无法理解为什么执行以下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.");
        }

        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