评估if ... else if ...块上的每个条件语句

时间:2010-10-15 18:41:07

标签: objective-c cocoa performance if-statement switch-statement

Objective-C是否评估if... else if...块上的每个语句,或者它是否会对每个语句进行评估,然后在找到真实条件时跳过剩余的评估?

这是一个与绩效相关的实用问题,而不是其他任何问题。

是的,我确实知道if块本身的内容没有被执行,但我指的是被评估的实际语句。

实施例

if ([condition A] == test) {
  // Do something
} else if ([condition B] == test) {
  // Do something    
} else if ([condition C] == test) {
  // Do something    
} else {
  // Do something because all other tests failed
}    

所以...如果条件A为真,那么条件B和C是否还要进行评估?

如果他们这样做,那么使用switch语句执行的方式是否相同,或者一个switch只测试每个条件,然后因为中断而退出评估?

我的理解是,在if... else if...块上,每个条件都会被评估,因此使用一个开关或嵌套if(呃 - 不要在那里思考)在大量的评估操作上可能会更快数据(数十万个项目正在检查可能的一百个陈述)。

好奇: - )

3 个答案:

答案 0 :(得分:12)

不,如果满足条件A,则不评估B和C.实际上,它们是其他条款的一部分,无论如何都不会被执行。

只是旁注:if (condA || condB)或if(condA&& condB)也懒惰地评估,即在第一种情况下condB仅在condA为假时评估,在第二种情况下condA为真。

答案 1 :(得分:4)

它只会对它们进行评估。 if ... else if块等同于if.. else {if...}。它的行为与嵌套ifs的行为相同,它的格式很好,省略了一些大括号。

答案 2 :(得分:2)

在[]的Objective-c之外,其行为方式与C完全相同。

对于if() ... else if() ... else ...个链,这意味着每个表达式都会被计算,直到一个表达式计算为true并输入该块。基本上

if (a) {
    ...
} else if (b) {
    ...
} else {
    ...
}

被解释为

if (a) {
    ...
} else {
    if (b) {
        ...
    } else {
        ...
    }
}