1

更新:这完全是一场野鹅追逐。在我根据建议的答案进行更改后,它起作用了。但是,当我稍后尝试时,它不再起作用。我开始意识到这完全取决于我是如何使用调试器的。我在 areSameColor 里面有一个断点。当我单步执行代码时,我假设 areUniqueColors 没有被执行。但是,我越过了第二种情况,我认为它是短路的。最后,它正确评估了以下两个选项。我选择坚持我的第二个例子,因为它看起来更具可读性。感谢大家的时间。

我对以下 if 语句的评估方式感到困惑......

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

在我的测试用例 [self areSameColor:setCards] 评估为 NO...所以使用!我希望它能够评估第二个条件。在查看调试器时,它似乎正在快捷地变成 TRUE 结果。

我也试过这个:

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

我怎么会想到这个错误?

4

2 回答 2

1

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

if( (![self areSameColor:setCards]) && (![self areUniqueColors:setCards]) )
{
    match = NO;
}
于 2013-04-08T04:50:27.463 回答
0

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

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

于 2013-04-08T05:09:22.290 回答