更新:这是一场疯狂的追逐。根据建议的答案进行更改后,它起作用了。但是,当我稍后尝试它时,它再次无效。我已经意识到这就是我使用调试器的方式。我在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
我怎么想到这个错误?
答案 0 :(得分:1)
对于这个“ areSameColor == NO 和 areUniqueColor == NO ” 试试这种方式
if( (![self areSameColor:setCards]) && (![self areUniqueColors:setCards]) )
{
match = NO;
}
答案 1 :(得分:0)
AFAIK,该标准没有规定应用于第一个操作数的非运算符是否触发短路评估。它规定&&然而,||从左到右进行评估。一般运算符(!)通常在||之前从右到左进行评估和&&。
至少,答案是灰色的,以保证以不同方式重新编码以避免整个混乱。