即使参数是函数调用,C是否也使用短路评估?

时间:2013-10-18 09:43:42

标签: c operators logical-operators

我知道逻辑运算符会进行短路检查。也就是说,如果存在类似A && B && C的语句,那么如果A为false,则不会评估BC。但在BC是函数调用的情况下,这也是如此吗?

例如,此代码中的return语句:

bool areIdentical(struct node * root1, struct node *root2)
{
    /* base cases */
    if(root1 == NULL && root2 == NULL)
        return true;

    if(root1 == NULL || root2 == NULL)
        return false;

    /* Check if the data of both roots is same and data of left and right
       subtrees are also same */
    return (root1->data == root2->data   &&               //I am talking about this statement
            areIdentical(root1->left, root2->left) &&
            areIdentical(root1->right, root2->right) );  
}

3 个答案:

答案 0 :(得分:3)

是的,如果root1->data == root2->datafalse,则不会调用这些函数。

简单检查就是这样做:

#include <unistd.h>
#include <stdlib.h>

int main(void)
{
  write(1, "z", 1);
  if ((1 == 0) && write(1, "a", 1) && write(1, "b", 1))
  {
    write(1, "c", 1);
  }
  write(1, "d", 1);
  return (EXIT_SUCCESS);
}

答案 1 :(得分:2)

如果我们查看draft C99 standard部分6.5.13 ,无论操作数是什么,逻辑和运算符都会短路逻辑AND运算符 4 表示(强调我的):

  

与按位二进制&amp;操作员,&amp;&amp;运营商保证从左到右的评估;   在评估第一个操作数后有一个序列点。 如果是第一个操作数   比较等于0,第二个操作数未评估

注意,只有当第一个是false时才会评估第二个操作数。另请注意,它保证了在第一次评估后的左侧评估和序列点。

答案 2 :(得分:0)

是的,在函数调用中也是如此。

#include<stdio.h>
void main()
{
    if(0&&printf("hello"))
    {
        printf("true");

    }
    else 
        printf("false");
}
例如,考虑上面的代码,它将输出为false。然而,在“if condition”中将0替换为1将输出为“hellotrue”。