2017-06-20 64 views
-3

我對單個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)。 –

回答

1

真的很可愛。 (我與nullptr更換預C++ 11 NULL。)如果lr均爲nullptr

continue將被調用。

而且由於||短路,l->val != r->val如果lnullptrrnullptr纔會被評估。

你需要習慣於像C++這樣的成語,這是你成爲語言流利的一部分。

注意,上解引用nullptr行爲在C 未定義 ++;不一定拋出異常。在談論標準C++時,不要談論空指針異常。

最後,你可以改變功能採取const TreeNode* root

+0

因此,如果以前的條件之一得到滿足,整個如果不被評估似乎? –

+0

這是正確的。 &&和||有這個屬性,除非重載。 – Bathsheba