我无法理解为什么如果执行块会跟随。如果条件将如何评估?
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.");
}
}
}
答案 0 :(得分:15)
&&
的优先级高于||
(source)。因此,添加括号以强调如何对其进行评估:
if (true || ((false || true) && false))
// -------------^-------------------------^
和
if ((false && (false || true)) || true)
// -----^-------------------------^
如您所见,您最终得到x || y
,其中第一个示例中的x
是true
,而第二个示例中的y
是true。自然,true || false
和false || 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 || true
是true
。
除此之外,您还需要了解其他两件事:
&&和||操作员“短路”,这意味着如果不需要,他们不会评估右侧。
当相同优先级的运算符出现在同一表达式中时,必须控制一个规则,该规则首先被评估。除赋值运算符外,所有二元运算符均从左到右评估 ;赋值运算符从右到左求值。
从优先级表中,我们知道&&
高于||
。
因此,在您的问题中,让我们进行基本推理。
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
。第二个也是如此。
答案 3 :(得分:0)
如果至少一个操作数为true,则使用$timeout
条件为true。例如。 setTimeout
产生||
。
因此,您的第一个条件为true的原因是 first true false || true
。
true
第二个条件为真,因为最后一个真 (true || ...
if (true || (false || true) && false)
......|...............................
看看Truth Table。
... || true)