if语句中的多个条件或条件

问题描述:

我对单个if语句的评估或条件存在基本疑问。假设l和r是指向树节点的指针,在指针变为null的情况下,检查行是评估并返回false。我想知道的是,因为l或r中的任何一个变为null,在相同的if语句中,是否也会为第三个条件引发空指针异常?如果我把第三个条件作为第一个条件作为第一个条件提出异常,那么是否有人强调了在每种情况下对两个语句(第二条语句作为评论提及)是如何评估的?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; 
} 
+6

C++中没有空指针异常。如果你解引用一个空指针,程序可以做任何事情。 – StoryTeller

+2

解引用一个无效指针(比如一个空指针),那么会导致[* undefined behavior *](http://en.cppreference.com/w/cpp/language/ub)。 –

真的很可爱。 (我与nullptr更换预C++ 11 NULL。)如果lr均为nullptr

continue将被调用。

而且由于||短路,l->val != r->val如果lnullptrrnullptr才会被评估。

你需要习惯于像C++这样的成语,这是你成为语言流利的一部分。

注意,上解引用nullptr行为在C 未定义 ++;不一定抛出异常。在谈论标准C++时,不要谈论空指针异常。

最后,你可以改变功能采取const TreeNode* root

+0

因此,如果以前的条件之一得到满足,整个如果不被评估似乎? –

+0

这是正确的。 &&和||有这个属性,除非重载。 – Bathsheba