1

論理演算子が短絡チェックを行うことは知っています。つまり、 のようなステートメントがあるA && B && C場合、ifAは false で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はい、 isの場合、関数は呼び出されません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標準セクションの草案を見ると、論理AND演算子はオペランドが何であるかに関係なく短絡します論理AND演算子の段落4は次のように述べています(強調鉱山):6.5.13

ビットごとのバイナリ & 演算子とは異なり、&& 演算子は左から右への評価を保証します。最初のオペランドの評価の後にシーケンス ポイントがあります。最初のオペランドが 0 と等しい場合、2 番目のオペランドは評価されません

2 番目のオペランドは、最初のオペランドが の場合にのみ評価されないことに注意してくださいfalse。また、右から左への評価と、最初の評価後のシーケンス ポイントが保証されることにも注意してください。

于 2013-10-18T12:11:51.380 に答える