7

如果第一个参数是/ if-statement,是否&& operator检查第二个参数?falseNO

以下会崩溃吗?

NSDictionary *someRemoteData = [rawJson valueForKey:@"data"];
if( [someRemoteData isKindOfClass:[NSDictionary class]] && someRemoteData.count > 0 ){
    //..do something
}

请不要简单地回答是或否,但要解释原因。

4

3 回答 3

21

不,在得知答案将是 后,它不会评估表达式NO。这称为短路,它是在 C、C++、Objective C 和其他具有类似语法的语言中评估布尔表达式的重要部分。从左到右评估条件,使评估方案可预测。

同样的规则也适用于||操作符:一旦代码知道值为YES,评估就会停止。

短路使您可以防止在单个复合表达式中进行无效评估,而不是选择if语句。例如,

if (index >= 0 && index < Length && array[index] == 42)

如果不是短路,将导致未定义的行为。但是由于评估跳过了array[index]何时index无效的评估,所以上面的表达式是合法的。

于 2013-01-15T15:29:28.370 回答
3

Objective-C 使用惰性评估,这意味着在您的情况下仅评估左操作数。

于 2013-01-15T15:41:06.463 回答
0

不,不是的。如果第一个语句失败,则永远不会检查第二个语句,例如,您可以这样做(ArrayList != null && ArrayList.size() > 0),如果变量未初始化,您将永远不会收到错误。

于 2013-01-15T15:31:31.043 回答