If语句的短路 - 如何评估

时间:2013-04-08 04:42:57

标签: ios

更新:这是一场疯狂的追逐。根据建议的答案进行更改后,它起作用了。但是,当我稍后尝试它时,它再次无效。我已经意识到这就是我使用调试器的方式。我在areSameColor里面有一个断点。当我踩过代码时,我假设areUniqueColors没有被执行。但是,我踩到了第二个条件,我认为它是短路的。最后,正确评估下面的两个选项。我选择坚持我的第二个例子,因为它似乎更具可读性。谢谢大家的时间。

我对以下if语句如何评估感到困惑......

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

在我的测试用例中[self 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

我怎么想到这个错误?

2 个答案:

答案 0 :(得分:1)

对于这个“ areSameColor == NO areUniqueColor == NO ” 试试这种方式

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

答案 1 :(得分:0)

AFAIK,该标准没有规定应用于第一个操作数的非运算符是否触发短路评估。它规定&&然而,||从左到右进行评估。一般运算符(!)通常在||之前从右到左进行评估和&&。

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