
4.4 选择结构
在银行办理业务时,如果人少,并且没有人排队,就可以直接选择柜台办理业务;如果排队的人很多,我们会选择自助取款机办理。在这里,选择办理业务的方式就是一种选择结构的体现。本节将详细讲解多种选择结构的语句形式。
4.4.1 单分支条件语句
单分支条件语句也称为if选择语句,适用于处理简单的选择执行。
if选择语句简称if语句,由一个if条件和执行语句块部分组成,只有一个分支。当条件为真时运行执行语句块,条件为假时,不运行执行语句块。其语法如图4.3所示。
当执行语句块部分只有一行语句时,花括号可以省略,其语法如图4.4所示。
注意:为了程序的可读性,一般不建议省略花括号。
if语句的执行流程如图4.5所示。

图4.3 if语句(1)

图4.4 if语句(2)

图4.5 if语句的执行流程
从图中可以看出,if语句的运行顺序由条件表达式的值决定。当条件表达式为真时,运行执行语句;当条件表达式为假时,则不运行执行语句。
【示例4-3】下面使用if语句,判断变量的值是否大于10。


程序运行结果如下。

从运行结果中可以看出,表达式a〈10的值为真,所以输出“变量a的值小于10”;表达式b〈10的值为假,所以不会输出“变量b的值小于10”。
4.4.2 双分支条件语句
双分支条件语句即if-else选择语句,该语句拥有一个条件和两个分支语句块,其语法形式如下。

if-else语句可以根据条件的值选择执行的分支语句。如果条件的值为真,执行语句块1;如果条件的值为假,执行语句块2。两个分支语句一次只能执行其中一个语句块。其执行流程如图4.6所示。

图4.6 if-else语句的执行流程
if-else语句适合处理有两个选项的数据。例如,判断小朋友是否符合上小学的年龄,如果年龄达到,告知家长可以上学;如果年龄过小,告知家长年龄不够。
【示例4-4】输入孩子年龄判断是否达到入学年龄。


程序运行结果如下。

从运行结果中可以看出,输入的年龄为8,表达式age 〉= 6的值为真,所以输出“恭喜您,您的孩子已经达到了入学年龄!”。
再次运行程序,运行结果如下。

从运行结果中可以看出,输入的年龄为5,表达式age 〉= 6的值为假,所以输出“很抱歉,您的孩子还未达到入学年龄!”。
4.4.3 if-else语句嵌套使用
if-else语句嵌套使用可以用于处理需要多重筛选的数据。嵌套时,需要将子级if-else语句嵌套至父级if-else语句的执行语句块中,并且可以根据需求无限嵌套使用,其语法形式如下。


if-else嵌套使用时,如果表达式1的值为真,则执行语句1并判断表达式2的值;如果表达式1的值为假,则执行语句4并判断表达式3的值。依次类推,层层进行判断选择,直到程序结束。
在录取新生时就需要进行多重条件筛选,简单筛选过程如图4.7所示。

图4.7 录取新生筛选过程
【示例4-5】下面实现录取新生筛选的小程序。

程序运行结果如下。


从运行结果中可以看出,输入者分数不达标,只能判断是否有特长。特长达标,继续判断是否身体健康。身体健康达标,最终输出“恭喜您,您被录取了”的提示。整个过程经过了三层if-else语句的筛选。
4.4.4 switch选择语句
switch选择语句也称为开关语句,它适合处理有三个及三个以上选项的数据,它的每一个分支都相当于一个开关。例如,根据分数可以划分为A、B、C、D四个等级,不同分数对应不同等级。
switch选择语句可以分为三种形式,分别为基础形式、默认分支形式及跳出语句形式,接下来进行详细讲解。
1.基础形式
switch选择语句的基础形式由switch条件、case子句、常量表达式、执行语句组成,其语法形式如下。

switch语句会使用条件表达式的值,依次与case子句的常量表达式的值进行比较。如果相等,则从当前case子句的执行语句开始,顺序执行后面所有的case子句的执行语句;如果不相等,则与下一个case子句进行比较,依次类推进行执行。
switch语句的执行方式就像一个人有一把钥匙,然后有很多门,门里有任务。他不确定这把钥匙能打开哪一扇门,但是如果能打开一扇门,则后续的所有门都会自动打开。他只需要依次执行打开的门里的任务即可。
【示例4-6】使用密码尝试打开对应的门。


程序运行结果如下。

从运行结果中可以看出,key的值303与第3个case子句的常量303相同,所以会从该case子句的执行语句开始,依次执行后续所有case子句的执行语句,并且不用对后续的case子句的常量表达式的值进行比较。
注意:这种运行顺序是switch语句最基础的运行顺序,一定不要套用到后续的形式。
2.默认分支形式
在开门时,有时会遇到一个问题。如果拿着的钥匙打不开所有的门,就不会有内容输出,这样对用户显得不友好。此时就需要向switch语句中添加一个默认分支语句default。增加后的语法形式如下。


default分支不受switch条件表达式的值影响,默认为执行。default分支通常放在switch语句的最后。增加默认分支default的switch语句执行流程如图4.8所示。

图4.8 增加默认分支default的switch语句执行流程
【示例4-7】下面演示当钥匙无法打开所有门时,输出提示语句。


程序运行结果如下。

从运行结果中可以看出,key的值203不符合所有的case子句的常量表达式的值,所以在最后输出了默认分支语句中的“已经尝试过所有的房间”,表示该程序已经运行过,只是没有打开任何房间。
3.跳出语句形式
如果规定钥匙只能打开一扇门,然后将门里的任务做完就行了,则使用带默认分支的switch语句显然是不够的,此时就需要引入跳出语句break。加入跳出语句break的switch语法形式如下。

当运行到break语句时,程序就会跳到switch语句块之外,不会再执行其他case语句和default语句。也就是使用钥匙打开一扇门后,会执行门里的任务,执行完该任务后会直接跳出该大楼之外,不会再去尝试开启其他的门。
增加跳出语句break的switch语句执行流程如图4.9所示。

图4.9 增加跳出语句break的switch语句执行流程
【示例4-8】下面演示使用303钥匙打开3号房间。


程序运行结果如下。

从运行结果中可以看出,当key的值为303时进入case 303分支语句,输出“恭喜你进入了房间3”;当执行到break之后会跳出switch语句的范围之外,输出“已经跳出switch语句范围”。
4.switch语句使用总结
对于switch语句一定要注意以下几点。
❑ switch语句的条件表达式必须是int、short、long、char类型。
❑ switch语句后面可以跟多个case分支语句,但要合理地组合顺序。
❑ switch语句所有分支的执行语句都可以省略,但是最后一个分支的执行语句不可以省略。
❑ case子句由case关键字、常量表达式与冒号组成,case关键字与常量表达式之间有一个空格,而且常量表达式中不能有变量存在。
❑ 不同case子句的常量表达式的值不能相同。
❑ case语句的执行语句可以包含多条语句,可以不使用大括号分隔。
❑ 在一个switch语句中只可以有一个default分支,否则程序就会出错。