Java中给定的if条件如何为真

时间:2018-07-20 10:55:50

标签: java if-statement conditional

我无法理解为什么如果执行块会跟随。如果条件将如何评估?

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

4 个答案:

答案 0 :(得分:15)

&&的优先级高于||source)。因此,添加括号以强调如何对其进行评估:

    if (true || ((false ||  true) && false))
// -------------^-------------------------^

    if ((false && (false ||  true)) || true)
// -----^-------------------------^

如您所见,您最终得到x || y,其中第一个示例中的xtrue,而第二个示例中的y是true。自然,true || falsefalse || true都是true

您可以通过使用一种输出正在执行的操作的方法(live copy)来查看它的运行情况(请记住||&& 短路 ,表示它们不评估无法更改结果的操作数):

public class Test
{
    private static boolean b(String label, boolean value) {
        System.out.println(label + ": " + value);
        return value;
    }
    public static void main(String[] args)
    {
        if (b("1", true) || (b("2", false) || b("3", true)) && b("4", false))
        {
            System.out.println("How does this condition becomes true.");
        }

        if (b("5", false) && (b("6", false) || b("7", true)) || b("8", true))
        {
            System.out.println("Same with this condition, why is it true.");
        }
    }
}

运行时,输出:

1: true
How does this condition becomes true.
5: false
8: true
Same with this condition, why is it true.

答案 1 :(得分:4)

首先,您必须已经知道false || truetrue

除此之外,您还需要了解其他两件事:

  

&&和||操作员“短路”,这意味着如果不需要,他们不会评估右侧。

  

当相同优先级的运算符出现在同一表达式中时,必须控制一个规则,该规则首先被评估。除赋值运算符外,所有二元运算符均从左到右评估 ;赋值运算符从右到左求值。

从优先级表中,我们知道&&高于||

因此,在您的问题中,让我们进行基本推理。

  

if(true ||(false || true)&& false)

true || no_matter_what_is_in_right_side将是true,所以我们得到了true

  

if(false &&(false || true)|| true)

这是一个比以前更棘手的问题,这一次,我们必须考虑烦人的优先级。我们的推理如下:

false && no_matter_what_is_in_right_side将是false,剩下的就是:

false || true

同样,我们最后还有true

但是,如果您已经注意到诀窍:我们从最右侧 true开始,那么我们可以进行推理,因为前一个直接获得了true

正如迈克尔提到的,我们最好使用括号来表示确切的顺序,而不要依赖优先级,这实际上很难记住##。

答案 2 :(得分:0)

好吧,我们来看一下第一行:

if (true || (false ||  true) && false)

根据优先级,将首先评估()之间的所有内容。因此,将是false || true,我们可以将||写为OR,这意味着我们得到true OR false,在这种情况下它将是true,因为一个这两个值中的true

好的,让我们继续前进,它变成这样:

if (true || true && false)

现在我们来谈谈您的困惑之处。在这种情况下,我们不会从左到右阅读。我们需要先看&&而不是||。因此,我们需要检查true && false的评估,它将变为false

然后我们留下以下语句:

if (true || false)

当然会成为true。第二个也是如此。

在此处查看:http://bmanolov.free.fr/javaoperators.php

答案 3 :(得分:0)

如果至少一个操作数为true,则使用$timeout条件为true。例如。 setTimeout产生||

因此,您的第一个条件为true的原因是 first true false || true

true

第二个条件为真,因为最后一个真 (true || ...

if (true || (false ||  true) && false)
......|...............................

看看Truth Table

... || true)