如果第一个条件为假,if语句是否优化为不调用递归函数?

时间:2016-04-27 18:57:55

标签: c if-statement recursion

考虑一下情景:

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;
}

如果我们遇到类似a->data != b->data的条件,那么是否会对(fun(a->left) == fun(b->left))(fun(a->right) == fun(b->right))进行递归调用,还是会直接对该条件说错?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

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

    return 1;
}