评估两个语句是否都是错误的

时间:2013-10-17 14:18:37

标签: java

我有一个ruby背景,是java的新手。它对我来说有点混乱,我有一个非常简单的练习,我无法保存。

我的方法如下:

public void act() 
    {
        while((treeLeft() == false) && (treeRight() == false))
        {
            move();
        }
    }
}

所以通常我的代码应该检查两边是否有树(treeleft == true和treeright == true),当两边真的树木停止而不移动时。

但不知何故它虽然左侧只有一棵树但它没有移动?我错了什么?

4 个答案:

答案 0 :(得分:3)

&&运算符的工作方式是首先评估左侧,如果评估为false,则不会因为评估右侧而烦恼,因为表达式的结果为无论右侧的结果如何,整体都是false。因此,一旦treeLeft()计算为true,while就会被破坏并移动停止。

执行此操作的正确方法是:

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

这意味着while将继续循环,直到treeLeft()和treeRight()计算为true。

替代版本,使用DeMorgan定律:

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

答案 1 :(得分:2)

&&运算符在{EERER值为false的任何时候评估为false

||运算符仅在BOTH值为false时才计算为false,并且可能是您在此情况下需要使用的值。

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

为清楚起见(我不熟悉Ruby)...... !treeLeft()treeLeft() == false完全相同

答案 2 :(得分:1)

我认为你正在寻找|| (或)运营商。为此,单击两个语句都需要为true。如果第一个陈述为真,那么你将结束循环。

如果您尝试短路以在左侧树上放置首选项,则将其保持在while循环条件中。重要的是要记住这些是按顺序评估的。短路可能非常有用。如果您需要解释,请查看此内容:https://www.student.cs.uwaterloo.ca/~cs132/Weekly/W02/SCBooleans.html

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

答案 3 :(得分:0)

在你的代码中,只有treeLeft()和treeRight()返回false时才会调用move()。这意味着只要您在左侧或右侧有树,就不会调用它。所以你想要的是:

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