【问题标题】:Is if statement optimized to not call recursive functions if first condition is false? [duplicate]如果第一个条件为假,if 语句是否优化为不调用递归函数? [复制]
【发布时间】:2016-04-27 18:57:55
【问题描述】:

考虑场景:

int fun(node* a, node* b){
    if(a == NULL && b == NULL) return 0;
    if( (a->data == b->data) && (fun(a->left) == fun(b->left)) && (fun(a->right) == fun(b->right)) return 1;
    return 0;
}

如果我们遇到了像 if a->data != b->data 这样的条件,那么会递归调用 (fun(a->left) == fun(b->left))(fun(a->right) == fun(b->right)) 还是直接对条件说 false?

【问题讨论】:

  • 这与优化无关。 if 语句的求值语义是核心语言规则的基本部分。
  • 这不是重复的,也不是在询问短路评估。当没有明确指定这些字段时,它会询问多个结构字段的递归比较。
  • 它与if 语句无关,而是与逻辑运算符的评估有关。答案适用于任何情况。
  • if(a == NULL && b == NULL) return 0; 包含逻辑错误。
  • @KerrekSB 嗯,每个人都会遇到这种情况。不过,它不应该太频繁。

标签: c if-statement recursion


【解决方案1】:

C 使用 short-circuit evaluation,因此如果 a->data == b->data 的计算结果为 false,则不会调用 fun(a->left)&& 右侧的其他函数。

【讨论】:

  • 太棒了。谢谢!!!
  • 当然。如果它回答了您的问题,请不要忘记接受这个或另一个答案。 ;-)
【解决方案2】:

没有。 将针对您指定的项目进行比较。您需要创建一个函数来对节点进行递归比较,或者比较节点结构中的多个字段。

int nodes_equal(node* a, node* b){

    if ((a->data != b->data) || (a->left != b->left) || (a->right != b->right))
        return 0;

    return 1;
}

【讨论】:

    猜你喜欢
    • 2021-08-25
    • 2013-05-12
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 2015-07-12
    • 2010-09-07
    • 2011-05-27
    相关资源
    最近更新 更多