c++ - 嵌套 if...else 语句如何优于 C++ 中的一系列单选 if 语句
问题描述
我正在阅读Paul 和 Harvey Deitel 的C++: How to Program, 第九版,我在第 114 页发现了一些让我有些困惑的东西。
书中给出了示例代码:
if ( studentGrade >= 90 ) // 90 and above gets "A"
cout << "A";
else
if ( studentGrade >= 80 ) // 80-89 gets "B"
cout << "B";
else
if ( studentGrade >= 70 ) // 70-79 gets "C"
cout << "C";
else
if ( studentGrade >= 60 ) // 60-69 gets "D"
cout << "D";
else // less than 60 gets "F"
cout << "F";
这本书接着说:
大多数程序员将前面的语句写成:
if ( studentGrade >= 90 ) // 90 and above gets "A"
cout << "A";
else if ( studentGrade >= 80 ) // 80-89 gets "B"
cout << "B";
else if ( studentGrade >= 70 ) // 70-79 gets "C"
cout << "C";
else if ( studentGrade >= 60 ) // 60-69 gets "D"
cout << "D";
else // less than 60 gets "F"
cout << "F";
除了编译器忽略的间距和缩进之外,这两种形式是相同的。后一种形式很受欢迎,因为它避免了代码向右的深度缩进,这可能会强制换行。
在其下方有一个标记为Performance Tip 4.1的框:
嵌套的 if...else 语句可以比一系列单选 if 语句执行得更快,因为在满足一个条件后可能会提前退出。
我不太明白这一点,因为(我假设“一系列单选 if 语句”表示第二个代码示例,使用if...else if
相同的缩进;非常流行的样式)根据我对 C 的理解和 C++,当一个if
语句或以下else if
语句之一被测试为真时,其余的else if
语句甚至都没有被测试,它们只是被跳过。那不是和早退一样吗?此外,这本书说,就编译器而言,这两种形式是相同的,为什么一种会胜过另一种呢?
解决方案
书中没有显示“一系列单选if语句”。它与您显示的两个代码示例类似,但没有else
关键字。但是,您必须添加一些代码来排除较早的情况。
if ( studentGrade >= 90 ) // 90 and above gets "A"
cout << "A";
if (studentGrade < 90 && studentGrade >= 80 ) // 80-89 gets "B"
cout << "B";
if (studentGrade < 80 && studentGrade >= 70 ) // 70-79 gets "C"
cout << "C";
if (studentGrade < 70 && studentGrade >= 60 ) // 60-69 gets "D"
cout << "D";
if (studentGrade < 60) // less than 60 gets "F"
cout << "F";
除了必须运行您知道将是错误的测试(在输出成绩之后)之外,后面的测试更复杂,并且在那些扩展测试中很容易出错(要么忘记排除早期的情况,要么不正确键入排除项)。所有这些额外的代码也使代码在阅读时更难理解。
所以使用if else
链对于性能、代码可读性和代码维护来说更好。
推荐阅读
- spring-boot - 您可以从 JWT 令牌中检索当前登录的用户吗?
- yaml - 如何更改国际蒸馏 yaml
- c# - 如何在windows窗体c#中画一条线?
- macos - 在自制软件中获取每个已安装公式的版本?
- azure - 将数据从 Sharepoint 复制到 Azure 数据工厂中的 Blob
- kubernetes - Hyperledger Fabric - 从 Docker swarm 迁移到 Kubernetes 可能吗?
- css - 如何在 Markdown 文件( .md 文件)中自定义字体样式?
- mysql - 有没有办法并行化 time.Sleep 但在 Go 中保持有效的执行时间?
- glsl - 使用 Vulkan 运行计算着色器时出现 LLVM 错误
- dataframe - 我不知道如何在数据框中进行条件分支