3.2 选择结构语句
根据不同的现有条件来决定用什么方法(或手段)解决问题,这种情况,无论在学习、工作及日常生活中比比皆是。假如某超市正在进行促销活动,规定凡购物总额达到1000元以上的顾客可享受九折优惠,在结账处就可以用这样的程序段解决问题:


这就是我们即将要向大家详细介绍的选择结构语句的设计与使用。
选择结构是根据假设的条件成立与否,再决定执行什么样语句的结构,它的作用是让程序更具有智能性。

3.2.1 if语句
if语句是最简单的选择结构语句,格式如下:  
i f<表达式>{  语句块}

其中表达式的设置是很重要的,它返回逻辑(布尔)值,如果true则进入{}部分的语句块处理。否则跳过该{}部分,执行下面的语句。如果{语句块}中只有一句语句,则左右大括号可以不写。If语句又称为单分支结构语句,它的执行流程如图3ˉ2所示。
例3.2.1 使用if语句判别两数是否相等。
程序如下:

如果程序中变量b的赋值为2,则根据if语句的运行规则将不输出任何结果。注意:该程序中表达式(a==b)中的关系运算符“==”不可以写成“=”。
例3.2.2 if语句的重复使用:从键盘出入三个数,将其按从小到大的顺序输出。
程序如下:

                                            

3.2.2 if-else语句
if-else语句的操作比if语句多了一步:如果表达式的值为假,则程序进入else部分的语句块(语句块2)处理。故它又被称为双分支结构语句。

例3.2.3 通过键盘输入两个整数,用ifˉelse结构判别这两个数是否相等,并分别输出不同信息。
程序如下:

例3.2.4 输入一个年份,由程序判断该年是否为闰年。
程序如下:

另外第2章中讲过的三元条件运算符:“<表达式>?e1:e2”有时可代替ifˉelse结构,如(x>y)?x:y将返回x和y中较大的值。

3.2.3 if-else if语句
if-else if语句用于处理多个分支的情况,因此又称多分支结构语句。
其语法格式为:


if-else if语句的执行流程如图3ˉ4所示。

 图3-4 if-else if语句流程图 

其中else部分为可选。Else总是与离它最近的if配对使用。
例3.2.5 用ifˉelse if语句实现下面的符号函数:

程序如下:


3.2.4 if语句的嵌套
在if语句中又包含一个或多个if语句称为if语句嵌套,这是程序设计中经常使用的技术。
例如现在有三个整数a、b、c,要判别它们能否构成三角形的三条边,则首先应判别这三个整数是否都大于零,然后才判别其任意两个数之和是否大于第三个数,其程序块为: 

3.2.5 switch语句
switch语句是Java支持的另一种多分支结构语句,使用switch语句进行程序设计,将使程序的结构更简练,表达更为清晰。
switch语句语法结构如下: 


图3ˉ5 switch语句流程图 

switch语句的流程图如图3ˉ5所示。
说明:switch后面的表达式只能返回如int、byte、short和char类型的值,多分支结构把表达式返回的值依次与每个case子句中的值相比较。如果遇到匹配的值,则执行该case后面的语句块。
case子句中的数值I必须是常量,且对应于执行不同操作的case子句中的数值I应是不同的。
default子句为可选。当表达式的值与任何case子句中的值都不匹配时,程序执行default后面的语句;当表达式的值与任何case子句中的值都不匹配且没有default子句,则程序将不执行任何操作,直接跳出switch语句。
break语句的作用是当执行完一个case分支后,终止switch结构的执行。因为case子句只是起到一个标号的作用,用来查找入口并从此处开始执行。如果没有break语句,当程序执行完匹配的case子句块后,还会执行后面的case子句块,这是不允许的。因此应该在每一个case分支后,用break语句终止后面的case分支语句块的执行。
例3.2.6 用switch语句处理表达式中的运算符,并输出运算结果。
程序如下:

程序运行结果:   80/9=8.888889
当多个相邻的case分支执行一组相同操作时,相同的程序段可只出现在其最后一个case分支中,相对应的break语句也只需在此最后一个case分支出现即可。
例3.2.7 使用switch语句与if语句的程序:由键盘输入年份与月份,由程序判别输出该年的那个月有多少天。
程序如下: