- 内容提要
- 前言
- 第 1 章 预备知识
- 第 2 章 开始学习 C++
- 第 3 章 处理数据
- 第 4 章 复合类型
- 第 5 章 循环和关系表达式
- 第 6 章 分支语句和逻辑运算符
- 第 7 章 函数——C++的编程模块
- 第 8 章 函数探幽
- 第 9 章 内存模型和名称空间
- 第 10 章 对象和类
- 第 11 章 使用类
- 第 12 章 类和动态内存分配
- 第 13 章 类继承
- 第 14 章 C++中的代码重用
- 第 15 章 友元、异常和其他
- 第 16 章 string 类和标准模板库
- 第 17 章 输入、输出和文件
- 第 18 章 探讨 C++新标准
- 附录 A 计数系统
- 附录 B C++保留字
- 附录 C ASCII 字符集
- 附录 D 运算符优先级
- 附录 E 其他运算符
- 附录 F 模板类 string
- 附录 G 标准模板库方法和函数
- 附录 H 精选读物和网上资源
- 附录 I 转换为 ISO 标准 C++
- 附录 J 复习题答案
6.5 switch 语句
假设要创建一个屏幕菜单,要求用户从 5 个选项中选择一个,例如,便宜、适中、昂贵、奢侈、过度。虽然可以扩展 if else if else 序列来处理这 5 种情况,但 C++的 switch 语句能够更容易地从大型列表中进行选择。下面是 switch 语句的通用格式:
C++的 switch 语句就像指路牌,告诉计算机接下来应执行哪行代码。执行到 switch 语句时,程序将跳到使用 integer-expression 的值标记的那一行。例如,如果 integer-expression 的值为 4,则程序将执行标签为 case 4:那一行。顾名思义,integer-expression 必须是一个结果为整数值的表达式。另外,每个标签都必须是整数常量表达式。最常见的标签是 int 或 char 常量(如 1 或'q'),也可以是枚举量。如果 integer-expression 不与任何标签匹配,则程序将跳到标签为 default 的那一行。Default 标签是可选的,如果被省略,而又没有匹配的标签,则程序将跳到 switch 后面的语句处执行(参见图 6.3)。
switch 语句与 Pascal 等语言中类似的语句之间存在重大的差别。C++中的 case 标签只是行标签,而不是选项之间的界线。也是说,程序跳到 switch 中特定代码行后,将依次执行之后的所有语句,除非有明确的其他指示。程序不会在执行到下一个 case 处自动停止,要让程序执行完一组特定语句后停止,必须使用 break 语句。这将导致程序跳到 switch 后面的语句处执行。
程序清单 6.10 演示了如何使用 switch 和 break 来让用户选择简单菜单。该程序使用 showmenu( ) 函数显示一组选项,然后使用 switch 语句,根据用户的反应执行相应的操作。
图 6.3 switch 语句的结构
注意:
有些硬件/操作系统组合不会将(程序清单 6.10 的 case 1 中使用的)转义序列\a 解释为振铃。
程序清单 6.10 switch.cpp
下面是该程序的运行情况:
当用户输入了 5 时,while 循环结束。输入 1 到 4 将执行 switch 列表中相应的操作,输入 6 将执行默认语句。
为让这个程序正确运行,输入必须是整数。例如,如果输入一个字母,输入语句将失效,导致循环不断运行,直到您终止程序。为应对不按指示办事的用户,最好使用字符输入。
如前所述,该程序需要 break 语句来确保只执行 switch 语句中的特定部分。为检查情况是否如此,可以删除程序清单 6.10 中的 break 语句,然后看看其运行情况。例如,读者将发现,输入 2 后,将执行 case 标签为 2、3、4 和 defualt 中的所有语句。C++之所以这样,是由于这种行为很有用。例如,它使得使用多个标签很简单。例如,假设重新编写程序清单 6.10,使用字符(而不是整数)作为菜单选项和 switch 标签,则可以为大写标签和小写标签提供相同的语句:
由于 case 'a'后面没有 break 语句,因此程序将接着执行下一行——case 'A'后面的语句。
6.5.1 将枚举量用作标签
程序清单 6.11 使用 enum 定义了一组相关的常量,然后在 switch 语句中使用这些常量。通常,cin 无法识别枚举类型(它不知道程序员是如何定义它们的),因此该程序要求用户选择选项时输入一个整数。当 switch 语句将 int 值和枚举量标签进行比较时,将枚举量提升为 int。另外,在 while 循环测试条件中,也会将枚举量提升为 int 类型。
程序清单 6.11 enum.cpp
下面是该程序的输出:
6.5.2 switch 和 if else
switch 语句和 if else 语句都允许程序从选项中进行选择。相比之下,if else 更通用。例如,它可以处理取值范围,如下所示:
然而,switch 并不是为处理取值范围而设计的。switch 语句中的每一个 case 标签都必须是一个单独的值。另外,这个值必须是整数(包括 char),因此 switch 无法处理浮点测试。另外 case 标签值还必须是常量。如果选项涉及取值范围、浮点测试或两个变量的比较,则应使用 if else 语句。
然而,如果所有的选项都可以使用整数常量来标识,则可以使用 switch 语句或 if else 语句。由于 switch 语句是专门为这种情况设计的,因此,如果选项超过两个,则就代码长度和执行速度而言,switch 语句的效率更高。
提示:
如果既可以使用 if else if 语句,也可以使用 switch 语句,则当选项不少于 3 个时,应使用 switch 语句。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论