2013-01-15 48 views
6

如果第一個參數是false/NOif-statement&& operator是否檢查第二個參數?如果帶有&&運算符的語句檢查第二個值?

下面能夠崩潰嗎?

NSDictionary *someRemoteData = [rawJson valueForKey:@"data"]; 
if([someRemoteData isKindOfClass:[NSDictionary class]] && someRemoteData.count > 0){ 
    //..do something 
} 

請不要簡單是或否回答,但解釋原因。

+0

如果Objective-C與這方面的幾乎所有其他語言一樣,答案是否定的,因爲'&&'快捷鍵。類似地,'||'將在它發現一個條件爲真時停止評估。 – fge

回答

18

不,它在得知答案將會是NO後不評估表達式。這稱爲短路,它是評估C,C++,Objective C和其他具有類似語法的語言中布爾表達式的重要組成部分。條件從左到右評估,使評估方案可預測。

相同的規則適用於||運營商:只要代碼知道值爲YES,評估就會停止。

短路可以防止單個複合表達式中的無效評估,而不是選擇if語句。例如,

if (index >= 0 && index < Length && array[index] == 42) 

如果不是用於短路,會導致未定義的行爲。但是由於評估跳過array[index]評估時index無效,上述表達式是合法的。

+0

更不用說那些條件是以它們出現的次序來評估的;)Java有着奇怪的行爲,而且''也不是_快捷方式。 – fge

+0

@fge感謝評價單的提示,這在本次討論中非常重要。 – dasblinkenlight

+0

謝謝澄清。我已經認爲它做了,只是想知道爲什麼。 –

0

不,它不。如果第一條語句失敗,第二條語句從不檢查,例如你可以這樣做(ArrayList != null && ArrayList.size() > 0),如果變量沒有被初始化,你永遠不會得到錯誤。

3

Objective-C使用lazy evaluation,這意味着在您的情況下只評估左操作數。

相關問題