
4-3 选择结构
选择结构主要是由if和switch来控制的,单纯的if为单项选择结构,switch为多项选择结构。当if与else搭配使用时,也可以实现多项选择的效果。
4-3-1 if语句
if语句是判断语句,用于判断某个条件是否成立,然后根据条件的值有选择地执行相应的语句。
1.if语句基本形式
if语句的语法格式如下。
if(条件表达式)
语句
或:
if(条件表达式)
{语句序列;}
参数说明如下:
● 条件表达式应该使用括号括起来。
● 如果条件表达式进行一次测试,且测试为真,则执行后面的语句。
● 当语句序列只包含一条语句时,该语句序列的花括号可以省略。
【示例4-2】if语句的基本用法(输入数值,如果大于0,输出“正数”)。

分析:当用户输入的数值大于0时,程序将输出“正数”到屏幕上;如果输入的数值不大于0(即等于或者小于0)时,则不进行任何处理。
2.if-else if形式
if-else if是多分支的选择结构,if和else结合使用时的语法格式如下。

如果“条件表达式1”的判断结果为真,则执行语句序列1;如果“条件表达式1”的判断结果为假,继续往下执行“条件表达式2”,如果为真,则执行语句序列2;如果为假,则继续往下执行,依此类推。if-else语句流程图如图4-3所示。

图4-3 if-else语句流程图
【示例4-3】利用if-else语句对数值进行正负的判断。
代码如下。

分析:运行结果将随着输入的数值不同而不同。当输入的数值为正数时,程序的输出结果为“正数”;当输入的数值为负数或0时,程序的输出结果为“非正数”。
4-3-2 switch语句
switch语句是多分支的选择语句,它和嵌套的if语句的功能类似,但是用switch语句更加直观。
switch语句的语法格式如下:

参数说明如下。
● default语句是默认的。
● switch后面括号中的表达式只能是整型、字符型或枚举型表达式。
● 在各个分支中加break语句可以起到退出switch语句的作用,否则将会遍历每一个分支。
● case语句起标号的作用。标号不能重名。
● 可以让多个case语句共用一组语句序列。
● 各个case(包括default)语句的出现次序可以是任意的。
● 每个case语句中不必用花括号({}),而整体的switch结构一定要写一对{}。
● switch结构也可以嵌套。
switch语句流程图如图4-4所示。

图4-4 switch语句流程图
【示例4-4】利用switch判断用户输入的日期是星期几。
代码如下:

程序的运行结果如下。

分析:这个例子中很明显,程序不符合最原始的设计要求,原因是什么呢?这是switch语句的一个特点。在switch语句中,“case常量表达式”相当于一个语句标号,表达式的值和某标号相等则转向该标号,在执行完该标号的语句后不会跳出整个switch语句,而是会继续执行后面的case语句。为避免这种情况,C++继承了C语言中的break语句,专用于跳出switch语句。将以上的程序稍加修改即可。
【示例4-5】判断输入的日期是星期几(使用break语句)
代码如下。

程序的运行结果如下。
Wednesday
分析:上面的程序中,当每个case语句后加上break后,程序的结果就达到了要求。在switch的使用中,一定需要注意与break的搭配使用。
switch语句和if语句都允许程序从选项中进行选择。相比之下,if else更为通用。if else可以处理取值范围。
【示例4-6】利用if语句根据成绩范围给出等级。
代码如下:

然而,switch不能处理取值范围,switch只能对确定的值进行条件测试。switch语句中的每一个case标签都是单独的值。而且这个值必须是整数或者char,因此switch无法处理浮点测试。另外case标签值必须是常量。如果是多个整数或者char的分支,使用switch比较简明和优雅。