以下代码块的工作原理如何?更具体地说,程序如何知道要返回哪个选项?
return ancestor (node1->left(), node2)
|| ancestor (node1->right(), node2)
|| ancestor (node2->left(), node1)
|| ancestor (node2->left(), node1);
此代码块是遍历树的代码的一部分,以便在给定树中的node1和node2时确定一个节点是否是另一个节点的祖先。
请注意,node1和node2被传递给负责确定是否存在祖先/后代关系的函数:
bool ancestor (const Binary_node<Type> * node1, const Binary_node<Type> * node2)
{
// .... code
}
答案 0 :(得分:2)
如果对ancestor
的一次调用返回true,则返回true(不评估其余的调用)。
答案 1 :(得分:2)
这些术语从左到右进行评估,第一个术语true
终止评估(快捷方式布尔评估)并返回true
。否则结果为false
。
答案 2 :(得分:2)
程序如何知道要返回哪个选项?
程序将继续尝试这些选项,直到找到有效的选项。
以下代码块的工作原理是什么?
在每次调用祖先()时,该函数将尝试四种可能性:
如果所有四种可能性都失败了,那么节点node1和node2肯定不会通过祖先关系相关。
警告:实施后,祖先功能非常慢,除了非常小的树。因为我们在每个祖先()调用中尝试四个选项,如果将树的高度增加1,则状态数大致为四倍。
答案 3 :(得分:1)
它从左到右进行评估,因此首先测试ancestor (node1->left(), node2)
。接下来,它查看按位运算符||
,它基本上表示“如果前一个操作为假,则尝试下一个操作”。
答案 4 :(得分:1)
我猜你的函数会返回一个bool。如果其中一个祖先是真的,它将返回true。如果使用两个布尔值,则结果如下:
A B (A || B) false false false true false true false true true true true true
如果使用多个布尔值(或值,可以解释为布尔值),则A||B||C..
等于((A||B)||C)||...
答案 5 :(得分:1)
它返回一个布尔值。因此,您引用的块仅使用short circuiting返回它找到的第一个true
值,如果它们都是这样评估,则使用false
。
答案 6 :(得分:1)
如果一个陈述有几个由||链接的子句或者&amp;&amp;然后评估是从左到右,第一次机会短路。在这种情况下为||正在使用该函数将从左到右(或在代码布局中从上到下)工作,并且第一次评估为true时它将返回true,从而避免评估其他选项。
答案 7 :(得分:1)
请注意,祖先只返回true / false。此代码使用早期逻辑表达式评估。在'或'(||)语句中。如果第一次调用没有返回true,则调用下一个,依此类推,直到其中一个返回true。如果它们都没有返回true,则返回false。
在这段代码中:如果我发现node1-&gt; left()是node2的祖先,我不必评估其余的语句,因为我已经知道了答案。