2013-04-08 89 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

据我所知,该标准没有规定是否适用于第一个操作数未符不和不会触发短路评估。它规定& &和||,但是,从左到右进行评估。一元运算符(!)通常在||之前从右到左进行求值和& &。

至少,答案是足够的灰色以保证以不同的方式重新编码以避免整个混乱。