一个给定的Java if条件语句如何返回true

9

我不明白为什么以下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.");
        }
    }
}

请参考以下链接:https://dev59.com/MHI95IYBdhLWcg3w1BhN - Tejal
4个回答

15

&& 的优先级高于 || (来源)。因此,添加括号以强调它们的计算方式:

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

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

正如您所看到的,x || y 这一表达式中,x 在第一个示例中为 true,而 y 在第二个示例中为 true。自然地,true || falsefalse || true 都是 true

您可以使用输出当前操作的方法(实时演示)来查看它的运行情况(请记住,||&& 操作符都采用短路求值,即不会评估不影响结果的操作数):

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
这个条件是如何变为true的。
5: false
8: true
同样也是这个条件,为什么它是true的。

5
值得注意的是:即使您知道优先级规则(很多Java开发人员并不知道),如果您包括括号,通常更容易快速确定逻辑。这也向读者传达了您的确切意图--我曾尝试过推断同事写表达式时是否真正理解了优先级规则,这甚至不好笑。 - Michael
1
@Michael 你在条件语句中使用括号是正确的,我在研究一些旧代码时发现了这一点。由于我不知道操作符优先级规则,所以我无法理解它是如何工作的。 - Rahul khandelwal

5
首先,你必须已经知道 false || truetrue
除此之外,你需要知道另外两件事:
- 短路求值。 - 运算符和优先级的烦人规则 & 和 || 运算符会“短路求值”,也就是说如果不必要,它们不会计算右侧表达式的值。
当同一表达式中出现相同优先级的运算符时,必须有一个规则来决定哪个运算符先计算。所有二元运算符(赋值运算符除外)都是从左到右计算的;赋值运算符是从右到左计算的。
根据优先级表,我们知道 && 的优先级高于 ||
所以,在你的问题中,让我们做基本推理。

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

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

如果(false && (false || true) || true)

这个比之前的更加棘手,这次我们必须考虑烦人的优先级。我们进行推理:

false && no_matter_what_is_in_right_side将会是false,然后我们剩下:

false || true

再次,我们在结尾处有true

但是,如果您已经注意到了这个技巧:我们从最右边的true开始,然后我们可以像前一个一样推理直接获得true

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


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


很抱歉要说这个:我们这里不做“数学”,因为逻辑运算中存在“短路”。 - Hearen

0

使用 || 运算符时,如果至少有一个操作数为 true,则条件为 true。例如,false || true 的结果是 true

因此,您的第一个条件是 true,因为有一个 第一个为 true(true || ...

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

第二个条件是真的,因为有 最后一个真 ... || true)
if (false && (false ||  true) || true)
...................................|..

请看一下真值表

OR
  P       Q     P||Q
--------------------
  T       F      T
  F       T      T
  T       T      T
  F       F      F

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接