2013-04-08 90 views
1

更新:這是一個瘋狂的追逐。在我根據建議的答案進行更改後,該方法奏效了。但是,當我稍後嘗試時,它不再工作。我已經意識到這一切都是在我如何使用調試器。我在areSameColor裏面有一個斷點。當我逐步完成代碼時,我認爲areUniqueColors沒有被執行。但是,我正在跨越第二個條件,我認爲這是短路。最後,它正確評估下面的兩個選項。我選擇堅持我的第二個例子,因爲它看起來更具可讀性。感謝大家的時間。If語句短路 - 如何評估

我如何if語句正在評估以下迷茫......

if(![self areSameColor:setCards] && ![self areUniqueColors:setCards]){ 
    match = NO; 
} 

在我的測試案例[自areSameColor:setCards]計算結果爲NO ...所以使用!我希望它能評估第二種情況。在看調試器的時候,它似乎正在變成一個真正的結果。

我也試圖與此:

if(!([self areSameColor:setCards] || [self areUniqueColors:setCards])){ 
    match = NO; 
} 

在這兩種情況下,它不會評估第二個條件。 areSameColor和areUniqueColor返回BOOL。

我的預期評估...

areSameColor | areUniqueColor | MATCH 
NO | NO | match = NO 
YES | NO | match UNCHANGED 
NO | YES | match UNCHANGED 

我怎麼思考這個錯誤的?

+0

areSameColor和areUniqueColors的預期結果是什麼,具體取決於您想要設置的匹配標誌。 – 2013-04-08 04:47:26

+0

在這種情況下,areSameColor == NO和areUniqueColor == YES。我期望match = NO被跳過。 – 2013-04-08 04:48:30

回答

1

對於這種「areSameColor == NO areUniqueColor == NO」 嘗試這種方式

if((![self areSameColor:setCards]) && (![self areUniqueColors:setCards])) 
{ 
    match = NO; 
} 
+0

對不起,也許我應該澄清...如果兩者areSameColor和areUniqueColor評估爲NO,則match = NO。 – 2013-04-08 04:54:09

+0

你的第一種方法是正確的。不過看上面的更新 – 2013-04-08 05:06:32

+0

是的,看起來像括號的位置強制每個!對每個條件獨立評估。謝謝你的幫助。 – 2013-04-08 05:14:38

0

據我所知,該標準沒有規定是否適用於第一個操作數未符不和不會觸發短路評估。它規定& &和||,但是,從左到右進行評估。一元運算符(!)通常在||之前從右到左進行求值和& &。

至少,答案是足夠的灰色以保證以不同的方式重新編碼以避免整個混亂。