我有一个ruby背景,是java的新手。它对我来说有点混乱,我有一个非常简单的练习,我无法保存。
我的方法如下:
public void act()
{
while((treeLeft() == false) && (treeRight() == false))
{
move();
}
}
}
所以通常我的代码应该检查两边是否有树(treeleft == true和treeright == true),当两边真的树木停止而不移动时。
但不知何故它虽然左侧只有一棵树但它没有移动?我错了什么?
答案 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()))