2016-02-01 43 views
-1

對不起。這個問題是由我粗心造成的。請忽略它,謝謝。在C++中,條件運算符不支持指針?

我嘗試解決問題後的LintCode,Add Two Numbers
首先,我試試這些代碼:first_code,但我得到了運行時錯誤,並且錯誤消息TERMSIG = 11.
然後,我將這些代碼更改爲second_code令我驚訝的是,它的工作。
唯一的區別是:
[首頁]

l1 = (l1) ? nullptr : l1->next; 
l2 = (l2) ? nullptr : l2->next; 

[二]

if(l1){ 
    l1 = l1->next; 
} 
else{ 
    l1=nullptr; 
} 
if(l2){ 
    l2 = l2->next; 
} 
else{ 
    l2=nullptr; 
} 

所以我不知道是否有條件的運營商的支持指針或不是?
我試試這些簡單的代碼:

#include <iostream> 
int main(){ 
    int* a = nullptr; 
    int b = 0; 
    b = (a) ? 1 : 10; 
    std::cout << b << std::endl; 
} 

它的工作。
但是爲什麼它在LintCode上的問題上失敗了。 我忽略了什麼?

+3

在你的第二行'l1 =(l2)? nullptr:l2-> next;'你的意思是分配給'l2'嗎? – CoryKramer

+0

[首]還不等於[第二]。 [首先]應該是'l1 =(l1)? l1-> next:nullptr;'或'l1 =(!l1)? nullptr:l1-> next;' – LogicStuff

+0

查看[Ternary條件運算符](http://en.cppreference.com/w/cpp/language/operator_other#Conditional_operator)。 – LogicStuff

回答

1

這兩段代碼做了不同的事情。

第一個有兩個錯誤。首先,你根本不分配l2。其次,如果指針爲空,則將其解引用。第二個版本沒有這些錯誤。

你似乎混淆了條件運算符的操作數的順序。如果第一個操作數爲真,則執行第二個操作數的表達式,如果第一個操作數爲假,則執行第三個操作數。

所以我不知道是否有條件的運營商的支持指針或不是?

它的確如此。您可能無法取消引用空指針。

2
l1 = (l1) ? nullptr : l1->next; 

相當於

if (l1) 
    l1 = nullptr; 
else 
    l1 = l1->next; 

的問題應該是顯而易見的。

很多人寧願完全跳過選擇分支,

if (l1) 
    l1 = l1->next; 

的分配nullptr一個空指針是不必要的(和看起來像別的東西之意)。