1

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

例如,这段代码中的 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) );  
}
4

3 回答 3

3

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

简单的检查就是这样做:

#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);
}
于 2013-10-18T09:47:12.583 回答
2

无论操作数是什么,逻辑和运算符都会短路,如果我们查看草案 C99 标准部分逻辑与运算符4段说(强调我的):6.5.13

与按位二进制 & 运算符不同,&& 运算符保证从左到右的求值;在计算第一个操作数之后有一个序列点。如果第一个操作数比较等于 0,则不计算第二个操作数

请注意,仅当第一个操作数是 时,才会计算第二个操作数false。另请注意,它保证从右到左的评估和第一次评估后的序列点。

于 2013-10-18T12:11:51.380 回答
0

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

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

    }
    else 
        printf("false");
}

例如考虑上面的代码,它将输出为假。然而,在“if condition”中将 0 替换为 1 将输出“hellotrue”。

于 2013-10-18T09:53:46.593 回答