5.4 嵌套if-else语句
嵌套if语句指在if分支或else分支中再次执行if或else语句。实际生活中,由于事件的复杂性,嵌套if语句被更多地应用到生活中。例如,外出旅行时对旅行方式的选择,有飞机、火车还有长途汽车。在选择飞机时又有多次航班、多种价格和多个航空公司的选择。选择火车时同样也有类似问题,如选择火车发车时间,车次等,如图5-6所示。这样在选定一种交通工具后还要继续分析判断更详细的问题。这就是一种嵌套分支的执行过程。
图5-6 交通工具分支选择流程图
5.4.1 嵌套if-else语句的定义
嵌套if-else语句根据实际需求各不相同,并有多种组合,其一般表达形式为:
if(表达式1) { if(表达式2) { 语句段1 } else { 语句段2 } } else { if(表达式3) { 语句段4 } else { 语句段5 } }
单层嵌套的if-else语句流程图如图5-7所示。
图5-7 单层嵌套if-else语句流程图
当存在多个if和一个else分支时,会出现else与if配对的问题,对于不同的理解,将出现不同的分支结构,如下为两种不同的表达形式:
表达1: if(表达式1) if(表达式2) 语句段1 else 语句段2 表达2: if(表达式1) if(表达式2) 语句段1 else 语句段2
C语言规定,else总是和它前面最近的一个if配对。这样就避免了因分支结构不同而导致程序出现的二义性。因此表达2为正确的表达形式,这里我们约定,为了避免程序阅读困难,对于if和else下的语句段,一律使用大括号加以封装。因此上述表达形式变为:
if(表达式1) { if(表达式2) { 语句段1 } else { 语句段2 } }
若想使else与最上面的if配对,则应使用大括号加以区分。其表达形式为:
if(表达式1) { if(表达式2) { 语句段1 } } else { 语句段2 }
5.4.2 嵌套if-else语句的应用
嵌套if-else语句的执行更加复杂,分支也更多。使用嵌套if-else语句时应注意,对语句段的定位一定要准确,否则程序会因为语句段分支定位错误而产生错误结果。
范例5.7 CompareTwoVariableValue.c
CompareTwoVariableValue.c键盘输入两个int型变量的值a和b,判断两个变量的大小,若a>b,则输出a>b;若a<b,则输出a<b;若a==b,则输出a==b。(光盘\chat5\ CompareTwoVariableValue.c)
01 #include<stdio.h> 02 03 main() 04 { 05 int a, b; 06 printf("请输入a和b的值:"); 07 scanf("%d%d", &a, &b); //输入a和b的值 08 if(a! =b) //判断a是否等于b 09 { 10 if(a>b) //嵌套分支,判断a是否大于b 11 { 12 printf("a>b\n"); 13 } 14 else //嵌套分支,判断a是否小于b 15 { 16 printf("a<b\n"); 17 } 18 } 19 else //a==b分支 20 { 21 printf("a==b\n"); 22 } 23 }
程序第8行判断a与b是否相等,若不等,继续下一步判断;若相等,则打印a==b。当a与b不等时,继续判断a与b的大小,如程序第10行所示。
程序运行时输入数据12和13,按回车键。
请输入a和b的值: 12 13
输出结果为:
a<b
嵌套的if-else语句除了能够处理多分支程序外,还可用于对程序可能出现异常的判断,如对程序不可能出现的异常情况判断,除数是否为0的判断,违反日常行为的判断等。例如,在判断某年是否为闰年时,应首先判断输入的年份是否符合常理,如定义year为int型变量,由键盘输入年份,则输入年份后应加以判断。
if(year<=0) { printf("ERROR: year should not be a Negative, Return\n"); }
像这种对输入参数作判断的语句称为入参检查,而printf函数打印的信息称为错误提示,在程序领域叫做trace。这类操作在程序编写中应用广泛,后续章节将继续作详细介绍。