为啥在 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 语句会更清晰,更易于维护。
【讨论】:
而且不易出错。您的两个陈述并不完全相反 - 您需要在第二个陈述中将&&
更改为 ||
。
@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 编译器时会抱怨,但简而言之却没有,为啥? [复制]