C/C++实践进阶之道:写给程序员看的编程书
上QQ阅读APP看书,第一时间看更新

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比较简明和优雅。