1

我有红宝石背景,并且是 Java 新手。这对我来说有点混乱,我有一个非常简单的练习,我无法保存。

我的方法如下所示:

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

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

但不知何故,虽然左边只有一棵树,但它却不动?我错了什么?

4

4 回答 4

3

运算符的工作方式&&是首先评估左侧,如果评估到false它就不会影响评估右侧,因为整个表达式false的结果将与右侧的结果无关。因此,一旦 treeLeft() 的计算结果为 true,while就会被破坏并停止移动。

正确的方法是:

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

这意味着while将继续循环,直到 treeLeft() 和 treeRight() 评估为真。

替代版本,使用德摩根定律:

while(!treeLeft() || !treeRight())
于 2013-10-17T14:24:41.880 回答
2

&&运算符的计算结果为false任何时候 EITHER 值为false

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

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

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

于 2013-10-17T14:22:05.327 回答
1

我想你正在寻找 || (或)运算符。要单击这两个语句必须为真。就目前而言,如果第一条语句为真,您将结束循环。

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

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

于 2013-10-17T14:23:16.657 回答
0

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

while(!(treeLeft() && treeRight())) 
于 2013-10-17T14:23:03.357 回答