为啥在 C++ 中使用 if-else if?

Posted

技术标签:

【中文标题】为啥在 C++ 中使用 if-else if?【英文标题】:Why use if-else if in C++?为什么在 C++ 中使用 if-else if? 【发布时间】:2009-10-07 01:26:15 【问题描述】:

如果可以再做一个 if 语句,为什么还要使用 if-else 语句?

具有多个 if 的示例:

input = getInputFromUser()
if input is "Hello"
    greet()

if input is "Bye"
    sayGoodbye()

if input is "Hey"
    sayHi()

else-if 示例:

input = getInputFromUser()
if input is "Hello"
    greet()

else if input is "Bye"
    sayGoodbye()

else if input is "Hey"
    sayHi()

【问题讨论】:

我的印象是这里允许提出与编程相关的问题,无论他们处于什么级别。对我们许多人来说,这似乎是一个基本问题,但我不明白为什么它被认为“不是一个真正的问题”。 @litb - 关键字更少,但条件更复杂 - 条件必须明确排除 else 会为您排除的内容。假设 else 是合适的,你最终会得到更多的单词、数字和符号。 不仅如此,它是否相同取决于您作为第一个分支的主体执行的内容。您可以更改条件变量...我认为翻转条件中使用的标志很常见,例如 我投票支持重新开放。这是一个有效的问题,并不是那个措辞不好。 这其实是一个很好的问题。对于给定的示例,编译器是否应该能够优化多个 if 并生成与 else-if 一样高效的代码?感谢“非建设性”的近距离投票者,我们可能看不到很多有趣的答案。 【参考方案1】:

如果您有非排他性条件:

if(a < 100)
...
else if (a < 200)
...
else if (a < 300)
....

这与没有“else”的相同代码非常不同......

【讨论】:

【参考方案2】:

它的性能也更高。

在您的第一个示例中,将检查 每个 if,即使输入是“Hello”。所以你有所有三个检查。

在您的第二个示例中,一旦找到分支,执行就会停止,因此如果用户键入“Hello”,它将只检查一次而不是三次。

在您的简单示例中差异可能不大,但假设您正在执行一个可能很昂贵的函数,您可能会看到差异。

【讨论】:

【参考方案3】:

你的意思是这样的:

if (a == true && b == false && c == 1 && d == 0) 
    // run if true


if (a == false || b == true || c != 1 || d != 0) 
    // else

else 语句会更清晰,更易于维护。

【讨论】:

而且不易出错。您的两个陈述并不完全相反 - 您需要在第二个陈述中将 &amp;&amp; 更改为 || @Chris Lutz,发现错误并与您差不多在同一时间修复它:-)【参考方案4】:

如果您需要从给定的一组动作中选择恰好一个动作,根据某些条件,自然和最明确的选择是切换(不要忘记在每个分支之后中断)或if 和 else 的组合。当我写作时

if (conditon1)

    action1();

else if (condition2) 

    action2();

else if (conditon3)

    action3();

.
.
.
else 
    action_n();

读者很清楚要执行其中一项操作。并且不可能因为条件错误而执行一个以上的动作。

【讨论】:

【参考方案5】:

按照您的相同示例,如果我们使用if 条件序列,无论输入是什么,它将运行所有 3 个条件。将 sequence of if 替换为 if-else 条件将在最好的情况下仅运行第一个条件,而在最坏的情况下运行所有​​ 3 个条件。

因此得出结论,if-else 在大多数情况下会节省我们的运行时间,因此使用if-else 优于使用sequence of if 条件。

input = getInputFromUser()
if input is "Hello"
    greet()

if input is "Bye"
    sayGoodbye()

if input is "Hey"
    sayHi()

【讨论】:

以上是关于为啥在 C++ 中使用 if-else if?的主要内容,如果未能解决你的问题,请参考以下文章

Python:为啥 if-else 一行语句在 else 中不能与 continue 一起使用?

为啥使用“if-else”语句会在看似相同的三元运算符构造不会产生 TypeScript 编译器错误?

为啥protobuf序列化“oneof”消息使用if-else

编写 if-else 编译器时会抱怨,但简而言之却没有,为啥? [复制]

为啥我在switch-case语句下嵌套if-else语句会报错?怎么改?

为啥C++标准库中没有transform_if?