2013-10-10 40 views
0

在避免雜散指針的情況下,這兩個條件如何評估?如果條件涉及AND避免雜散指針

if (vShop[0].vItem[vShop[0].itsActiveItem]!=NULL && vShop[0].vItem[vShop[0].itsActiveItem]->itsQuantity>0) DoPurchase(); 

其中vShop [0]是對象的向量,vItem是向對象的指針向量。

我想確保之前指針不計算NULL 它進一步檢查vShop [0] .vItem [vShop [0] .itsActiveItem] - > itsQuantity> 0。

或者我應該有單獨做到這一點,那就是:

if (vShop[0].vItem[vShop[0].itsActiveItem]!=NULL) if (vShop[0].vItem[vShop[0].itsActiveItem]->itsQuantity>0) DoPurchase(); 

換句話說做的第一案是一個連續的檢查,如果第一個條件計算,第二個條件是自動刪除?非常感謝。

+0

使用'if(ptr!= NULL && ptr-> something == x)'是完全可以接受的。如果它變成一長串這樣的表達式,我寧願將它分解成單獨的行,但是。 –

+0

如果你想獲得更多的信息,它叫做短路。同樣,如果(x || y)'如果'x'爲真則不評估'y'。 – clcto

+0

這不僅僅是可以接受的,它是確保測試不通過空指針的標準習慣用法。如果表情變得太長,這可能是德米特法則被打破的標誌。 –

回答

3

您可以使用前者,因爲&&只評估第二個條件,如果第一個條件是true。因此代碼如

if (p != NULL && p->age == 42) 

是完全有效的。

只有在處理內置類型時纔會發生這種情況,當UDT重載&&時,同樣的假設不再成立,但對於普通指針而言,上述內容很好,而且正是您所需要的。

+0

事實上,除非「foo」的類型具有定義用於與字符串進行比較的運算符「==」。 –

+0

@HotLicks無論如何我都改進了答案,以避免混淆和分散眼前的真實話題。 –

+0

@ user2856452我不確定你是否正確理解了'=='無關的混淆,所以我改進了答案。希望現在清楚。 –