if语句中的多个或条件

时间:2017-06-20 07:32:05

标签: c++ pointers if-statement

我对单个if语句中的条件或条件有一个基本的疑问。假设l和r是指向树节点的指针,在其中任何一个指针变为空的情况下,评估检查行并返回false。我想知道的是,当l或r中的任何一个变为null时,不应该为同一if语句中的第三个条件引发空指针异常吗?如果我将第三个条件作为第一个条件放置,则引发异常。有人可以突出显示在每种情况下如何评估两个语句(第二个语句作为注释被提及)?

bool isSymmetric(TreeNode* root) {
    queue<TreeNode*>q;
    if (root == NULL)
        return true;
    q.push(root->left);
    q.push(root->right);
    TreeNode *l, *r;
    while (!q.empty())
    {
        l = q.front();
        q.pop();
        r = q.front();
        q.pop();
        if (l == NULL && r == NULL)
            continue;
        if (l == NULL || r == NULL || l->val != r->val) return false; //check
        //  if (l->val != r->val || l == NULL || r == NULL)
        q.push(l->left);
        q.push(r->right);
        q.push(l->right);
        q.push(r->left);
    }
    return true;
}

1 个答案:

答案 0 :(得分:1)

真的很可爱。 (我正在用NULL替换前C ++ 11 nullptr。)

如果continue l都是r,则会调用

nullptr

由于||已被短路,l->val != r->val仅在l不是nullptr r时才会被评估不是nullptr

你需要习惯于在C ++中习惯这样的习语,作为你熟练使用该语言的一部分。

请注意,解除引用 nullptr上的行为在C ++中是 undefined ;不一定抛出异常。在谈论标准C ++时,不要谈论空指针异常。

最后,您可以将功能更改为const TreeNode* root吗?