2017-06-20 6 views
-3

Ich hatte grundlegende Zweifel an der Auswertung von oder Bedingungen innerhalb einer einzigen if-Anweisung.Setzen Sie l und r sind Zeiger auf Tree Nodes, in einem Szenario, in dem einer der Zeiger Null wird, ist die Check-Zeile evaluated und false wird zurückgegeben. Was ich wissen möchte ist, wie entweder von l oder r wird Null, sollte nicht eine Null-Zeiger-Ausnahme auch für die dritte Bedingung in der gleichen if-Anweisung ausgelöst werden? Wenn ich die dritte Bedingung als erste setze, wird eine Ausnahme ausgelöst. Kann jemand hervorheben, wie beide Aussagen (zweite Aussage wird als Kommentar erwähnt) jeweils bewertet werden?Mehrere oder Bedingungen innerhalb von if-Anweisungen

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

In C++ gibt es keine Nullzeiger-Ausnahmen. Wenn Sie einen Nullzeiger dereferenzieren, darf das Programm was auch immer machen. – StoryTeller

+2

Die Dereferenzierung eines ungültigen Zeigers (wie zum Beispiel eines Null-Zeigers) führt dann zu [* undefiniertem Verhalten *] (http://en.cppreference.com/w/cpp/language/ub). –

Antwort

1

Es ist ziemlich süß wirklich. (Ersetze ich die Pre-C++ 11 NULL mit nullptr.)

continue wird aufgerufen, wenn lundr beide nullptr sind.

Und weil || kurzgeschlossen, l->val != r->val wird nur ausgewertet werden, wenn l nicht nullptrundr ist nicht nullptr ist.

Sie müssen sich an Idiome wie diese in C++ als Teil Ihrer fließenden Sprachkenntnisse gewöhnen.

beachte, dass das Verhalten auf Dereferenzierennullptr ist undefinierten in C++; Eine Ausnahme wird nicht unbedingt ausgelöst. Sprechen Sie nicht über Nullzeigerausnahmen, wenn Sie über Standard-C++ sprechen.

Schließlich können Sie die Funktion ändern, um eine const TreeNode* root zu nehmen?

+0

Wenn also eine der vorherigen Bedingungen erfüllt ist, wird das ganze if nicht ausgewertet? –

+0

Das ist richtig. Beide && und || Habe diese Eigenschaft, es sei denn, sie ist überladen. – Bathsheba