给定if条件如何在java中给出true

Rah*_*wal 9 java conditional if-statement

我无法理解为什么跟随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.");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 15

&&优先级高于||().因此,增加一些内容来强调如何评估这些内容:

    if (true || ((false ||  true) && false))
// -------------^-------------------------^
Run Code Online (Sandbox Code Playgroud)

    if ((false && (false ||  true)) || true)
// -----^-------------------------^
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,你结束了x || y在那里xtrue第一个例子,并且y是在第二个例子中真实的.当然这两个true || falsefalse || truetrue.

您可以通过使用输出它在做什么(方法见它在行动现场副本)(请记住,这两个||&& 短路,这意味着他们不评价不能改变结果操作数):

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.");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

运行时,输出:

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

  • 值得注意的是:即使您*知道*优先规则(以及大量Java开发人员都没有),如果包含括号,快速找出逻辑几乎总是更容易.它还告诉读者你的确切意图是什么 - 我不得不尝试推断一个同事在写一个表达时是否真正理解了优先规则的次数甚至都不好笑. (5认同)

Hea*_*ren 5

首先,你必须已经知道false || trueis true

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

&& 和 || 运算符“短路”,这意味着如果没有必要,他们不会评估右侧。

当优先级相同的运算符出现在同一个表达式中时,必须有一个规则来控制哪个先求值。除了赋值运算符之外的所有二元运算符都是从左到右计算的;赋值运算符从右到左计算。

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

所以在你的问题中,让我们做基本的推理。

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

true || no_matter_what_is_in_right_sidetrue,所以我们得到了一个true.

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

这一次比上一次更棘手,这次我们必须考虑烦人的优先级。我们的推理如下:

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

false || true
Run Code Online (Sandbox Code Playgroud)

再次,我们有true最后。

但是如果你已经注意到了这个技巧:我们从最右边 开始,true那么我们可以像前面的那样直接得到true.

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