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;
}
真的很可爱。 (我与nullptr
更换预C++ 11 NULL
。)如果l
和r
均为nullptr
continue
将被调用。
而且由于||
短路,l->val != r->val
如果l
不nullptr
和r
不nullptr
才会被评估。
你需要习惯于像C++这样的成语,这是你成为语言流利的一部分。
注意,上解引用nullptr
行为在C 未定义 ++;不一定抛出异常。在谈论标准C++时,不要谈论空指针异常。
最后,你可以改变功能采取const TreeNode* root
?
因此,如果以前的条件之一得到满足,整个如果不被评估似乎? –
这是正确的。 &&和||有这个属性,除非重载。 – Bathsheba
C++中没有空指针异常。如果你解引用一个空指针,程序可以做任何事情。 – StoryTeller
解引用一个无效指针(比如一个空指针),那么会导致[* undefined behavior *](http://en.cppreference.com/w/cpp/language/ub)。 –