【问题标题】:Evaluating every conditional statement on an if... else if... block在 if...else if... 块上评估每个条件语句
【发布时间】:2010-10-15 18:41:06
【问题描述】:

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 (呃 - 不要喜欢那里的想法)可能会更快地对大量数据进行大型评估操作(数十万个项目正在与可能的一百个语句进行检查)。

只是好奇:-)

【问题讨论】:

  • 更好的问题是,“C 是否...?”因为基本流控制继承自 C。Objective-C 是 C 的超集。

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


【解决方案1】:

不,如果满足条件 A,则不评估 B 和 C。事实上,它们是 else 子句的一部分,无论如何都不会被执行。

附注:if (condA || condB) 或 if (condA && condB) 也会延迟评估,即在第一种情况下,仅在 condA 为假时评估 condB,在第二种情况下,当 condA 为真时评估。

【讨论】:

  • Eiko - 旁注实际上可以派上用场,对我来说是问题的下一个自然延伸......很高兴知道。谢谢。
  • 计算机科学术语是“短路评估”。见en.wikipedia.org/wiki/Short_circuit_evaluation
  • @Eiko,你的旁注对我很重要。你有一个苹果开发者链接来告诉我你从苹果那里得到这个信息吗?我的意思是我有一个很长的 if 语句,出于速度的原因,我想确保它只会在第一个为真时检查第二个,如果第一个和第二个为真,则只检查第三个,依此类推。我想阅读更多关于如何在 Objective-C 中处理 IF 的内容。谢谢
  • @HpTerm 这不是特定于 ObjC - 它是 C 的标准功能。也许从 Andrew 的维基百科链接开始。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    对于if() ... else if() ... else ... 链,这意味着对每个表达式进行评估,直到其中一个评估为真并进入块。基本上

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

    被解释为

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

    【讨论】:

    • Olliej - 感谢您的反馈。这对我的代码来说都是好消息 :-)
    猜你喜欢
    • 1970-01-01
    • 2013-03-05
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多