2011-12-19 78 views
0

這個問題已經纏着我了一會兒如果嵌套,檢查指針是否有效,然後檢查值

是它通常有一段代碼是這樣的:

bool failed = false; 
if (ptr) 
{ 
    if (ptr->value == foo) 
    { 
     print("error"); 
     failed = true; 
    } 
} 
if (!failed) 
{ 
    print("all systems go"); 
} 

,或者可以它與布爾完成? 我想前兩個if可能在一行,但我不知道在不同的環境中他們被檢查的順序,我認爲這可能會使它更難閱讀。

+1

什麼是上下文?首先,你可以用'if(ptr && ptr-> value == foo)'代替前兩個ifs。但是權威的代碼將取決於未顯示的代碼的其餘部分。 – fge 2011-12-19 11:07:00

回答

0

所有的編譯器應該遵循同樣的precedence order,所以檢查可以通過這種替換:

if (ptr && ptr->value == foo) 
{ 
    print("error"); 
    failed = true; 
} 

如果第一部分(孤ptr)爲假,則表達式的其餘部分將無法進行評估。這被稱爲短路。

+0

謝謝!並感謝我應該用google搜索的鏈接 – richy 2011-12-19 23:24:45

2

你總是可以依靠布爾運算符short-circuiting

const bool failed = (ptr != NULL) && (ptr->value == foo); 

如果第一(ptr != NULL)計算爲false這不會評估第二部分。

2

你可以寫你的情況是這樣的:

if (ptr && ptr->value == foo) 
{ 
    print("error"); 
} 
else 
{ 
    print("all systems go"); 
} 

在C++中,條件懶洋洋地評估。一旦知道最終結果,評估就會停止。因此,對於OR,第一個真正的停止評估,爲AND,第一個假結束評估

+0

它與條件沒有任何關係。短路是布爾運算符的一個屬性。 – 2011-12-19 11:09:47

+0

感謝您比我更精確;-) – crazyjul 2011-12-19 11:10:39

+0

不客氣;) – 2011-12-19 11:11:55

1

在這種情況下,你當然可以這樣做:

if (ptr && (ptr->value == foo)) 
{ 
    print("error"); 
} 
else 
{ 
    print("all systems go"); 
} 

這樣保證了邏輯與和邏輯OR從左到右進行評估,當結果已知時評估將停止。所以這是安全的。

0

,你可以只寫if(ptr && ptr->value == foo')

Ç保證,如果第一個條件會失敗,第二個條件將無法在所有的檢查。這是因爲FALSE & ANYTHING == FALSE。

1

如果你不需要你以後failed布爾,該代碼不完全一樣的。

if (ptr && ptr->value == foo) { 
    print("error"); 
} else { 
    print("all systems go"); 
} 

的檢查在if語句的順序是明確定義和 - 運算符跳過第二比較ptr->value=foo如果第一個表達式是不正確的&&