【问题标题】:Is using If, ElseIf, ElseIf better than using If, If, If?使用 If、ElseIf、ElseIf 是否比使用 If、If、If 更好?
【发布时间】:2010-05-22 00:29:50
【问题描述】:

使用真的有区别吗

If(this)
{
}
Else If(that)
{
}
Else
{
}

或使用,

If(this)
{
}
If(that)
{
}
Else
{
}

? 执行速度更快吗?编译器或架构有什么不同吗?

【问题讨论】:

  • 这是基本的编程问题,你可以在 c 书 4 章找到答案
  • 你试过运行你的代码吗?
  • “执行得更快”是您在决定使用哪个构造时应该担心的最后件事。第一个考虑因素是正确性——它们做不同的事情,正如下面许多优秀的答案所解释的那样,所以选择给出正确答案的那个。 #2 清晰:当有两个有效选项时,选择更易于阅读和理解的选项。
  • 假设我说:“如果商店有可乐,就给我买可乐。如果他们有百事可乐,给我买百事可乐。如果他们有激浪,请给我买激浪。”现在假设商店出售所有三种苏打水。你应该买什么?根据我逻辑上的要求:所有三个。 “else”这个词有很大的不同。

标签: if-statement


【解决方案1】:

this-block 和 that-block 的内容可以以第二种形式执行,而第一种形式最多允许其中一种被执行。

比较这两个 Python sn-ps:

x = 10

if x > 5:
    print "x larger than 5"
elif x > 1:
    print "x larger than 1"
else:
    print "x not larger than 1"

# output: x larger than 5

x = 10

if x > 5:
    print "x larger than 5"
if x > 1:  # not using else-if anymore!
    print "x larger than 1"
else:
    print "x not larger than 1"

# output line 1: x larger than 5
# output line 2: x larger than 1

正如其他人所提到的,您通常不应该关心这些变体之间的性能,而是应该关心正确性。然而,既然你问了......所有其他条件都相同,第二种形式会更慢,因为第二个条件 必须 被评估。

但除非您确定以这种形式编写的代码是一个瓶颈,否则您甚至考虑优化它都不值得。在从第一种形式切换到第二种形式时,您放弃了跳出第一个 if 语句并返回对第二个条件的强制评估。根据语言的不同,这可能是一个非常微不足道的差异。

【讨论】:

  • 对,两者在观察上是等价的,只是thisthat是互斥的。附带说明一下,由于编译器如何为两者生成代码,可能会对性能产生影响。对于像 lisaac 这样的语言,如果可能的话,if 块是使用调度表编译的,使用 else if 可以提高性能。
【解决方案2】:

是的,在您的第一个示例中,如果 this 计算结果为 true,并且计算结果为 true,则只会执行第一个代码块,而在第二个示例中,它们都会执行。

它们不等价

【讨论】:

    【解决方案3】:

    是的。

    在第一种情况下:如果当前条件失败,控制流只会检查下一个条件,但在第二种情况下,它将检查遇到的所有条件。

    在第一种情况下,只有在所有先前的条件都不为真时才会执行 Else 部分。并且在第二种情况下,仅当最后一个 If 条件失败时。

    【讨论】:

    • 在第二种情况下,如果第一个 if 为真,第二个为假,则可以评估 Else 语句。
    【解决方案4】:

    它有所作为。

    如果“this”和“that”都为真,那么这两个部分的代码都会产生其他结果。

    【讨论】:

      【解决方案5】:

      在第一个代码中。 它将检查 IF,如果 this 为真,则执行其主体, 如果为假,那么将 检查 ELSEIF 如果 that 为真,则执行其主体, 如果为假,那么将 执行 else 的主体。

      第二个代码 它将检查 IF,如果 this 为真,则执行其主体, 如果 false 什么也不做。 检查第二个 IF 如果 that 为真,则执行其主体, 如果为假,那么将 执行 else 的主体。

      【讨论】:

        猜你喜欢
        • 2010-10-12
        • 1970-01-01
        • 1970-01-01
        • 2016-11-21
        • 1970-01-01
        • 1970-01-01
        • 2011-11-01
        • 1970-01-01
        • 2018-05-05
        相关资源
        最近更新 更多