Java 计算两个语句是否都为false

Java 计算两个语句是否都为false,java,Java,我有ruby背景,对java不熟悉。这对我来说有点困惑,我有一个非常简单的练习,我无法保存 我的方法如下所示: public void act() { while((treeLeft() == false) && (treeRight() == false)) { move(); } } } 所以通常我的代码应该检查两边是否都有一棵树(treeleft==true和treeright==t

我有ruby背景,对java不熟悉。这对我来说有点困惑,我有一个非常简单的练习,我无法保存

我的方法如下所示:

public void act() 
    {
        while((treeLeft() == false) && (treeRight() == false))
        {
            move();
        }
    }
}
所以通常我的代码应该检查两边是否都有一棵树(treeleft==true和treeright==true),当两边都有树时,它们会停止并且不移动


但不知怎的,尽管左边只有一棵树,它还是不动了?我错了什么

&&
运算符在任一值为
false
时计算为
false

|
运算符仅当两个值都为
false
时才计算为
false
,这可能是在这种情况下需要使用的

while(!treeLeft() || !treeRight()) { /*do stuff*/ }

为了清楚起见(我不熟悉Ruby)<代码>!treeLeft()与
treeLeft()==false

&
运算符在任何值为
false
时计算为
false

|
运算符仅当两个值都为
false
时才计算为
false
,这可能是在这种情况下需要使用的

while(!treeLeft() || !treeRight()) { /*do stuff*/ }
为了清楚起见(我不熟悉Ruby)<代码>!treeLeft()与代码中的
treeLeft()==false

完全相同。只有当treeLeft()和treeRight()都返回false时,才会调用move()。这意味着只要左边或右边有一棵树,它就不会被调用。所以你想要的可能是:

while(!(treeLeft() && treeRight())) 
在代码中,只有当treeLeft()和treeRight()都返回false时,才会调用move()。这意味着只要左边或右边有一棵树,它就不会被调用。所以你想要的可能是:

while(!(treeLeft() && treeRight())) 

我想你在找| |(或)接线员。要单击此项,两个语句都必须为true。目前的情况是,如果第一条语句为真,则将结束循环

如果您试图短路以在左树上放置首选项,则首先将其保持在while循环状态。重要的是要记住,这些都是按顺序进行评估的。短路可能非常有用。如果需要解释,请查看下面的示例:


也可以给你一些关于如何重组的提示

我想你正在寻找| | |(or)操作符。要单击此项,两个语句都必须为true。目前的情况是,如果第一条语句为真,则将结束循环

如果您试图短路以在左树上放置首选项,则首先将其保持在while循环状态。重要的是要记住,这些都是按顺序进行评估的。短路可能非常有用。如果需要解释,请查看下面的示例:


还可以给您一些提示,告诉您应该如何重新构造操作符的工作方式是首先计算左侧,如果计算结果为
false
,则不必计算右侧,因为无论右侧的结果如何,表达式的整体结果都将是
false
。因此,一旦treeLeft()的计算结果为true,则
while
将中断并停止移动

正确的方法是:

while(!(treeLeft() && treeRight())) 
这意味着
while
将继续循环,直到treeLeft()和treeRight()的计算结果都为true

使用DeMorgan定律的替代版本:

while(!treeLeft() || !treeRight())

&
运算符的工作方式是首先计算左侧,如果计算结果为
false
,则不必计算右侧,因为表达式作为一个整体的结果将是
false
,无论右侧的结果如何。因此,一旦treeLeft()的计算结果为true,则
while
将中断并停止移动

正确的方法是:

while(!(treeLeft() && treeRight())) 
这意味着
while
将继续循环,直到treeLeft()和treeRight()的计算结果都为true

使用DeMorgan定律的替代版本:

while(!treeLeft() || !treeRight())

这在Java中应该和在Ruby中一样有效。你是说
false
还是
true
?正如您的代码一样,如果
treeLeft()
treeRight()
都返回
false
,那么它将调用
move()
;否则就不行了。这就是你想要的吗?如果(!treeLeft()&&&!treeRight()){treeLeft()和treeRight()返回布尔值还是布尔值,那么
有什么问题吗?为了让事情变得更简单,请尝试
(treeLeft()&&treeRight())
无需检查布尔值。希望您能得到答案,只需补充一点,在java中,根据java指南,布尔值不应与==进行比较。它应该像if(booleanField)一样使用,而不是像if(booleanField==true)一样使用正如你在答案中看到的那样:)这在Java中应该和在Ruby中一样有效。你的意思是
false
还是
true
?就像你的代码一样,如果
treeLeft()
treeRight()
都返回
false
,那么它会调用
move()
;否则它不会。这是你想要的吗?如果
有什么问题吗(!treeLeft()&&!treeRight()){
treeLeft()和treeRight()是返回布尔值还是布尔值?要使事情变得更简单,请尝试
(treeLeft()&&treeRight())
无需检查布尔值。希望您能得到答案,只需补充一点,在java中,根据java指南,布尔值不应与==进行比较。它应该像(booleanField)一样使用,而不像您在答案中看到的那样(booleanField==true)。:)我不认为
&
的短路行为是相关的。DeMorgan定律,这就是钱的所在。
&
没有那么重要,但它解释了他所看到的行为,左侧单独破坏
,而
。另外,对于新的java开发人员来说,很高兴知道:)对,DeMorgan定律适用于短电路和非短路运算符。它也适用于位运算符:
~(a&b)
等于
(~a)|(~b)
,和
~(a | b)
等于
(~a)