C语言程序设计案例精粹
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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型变量的值ab,判断两个变量的大小,若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行判断ab是否相等,若不等,继续下一步判断;若相等,则打印a==b。当ab不等时,继续判断ab的大小,如程序第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。这类操作在程序编写中应用广泛,后续章节将继续作详细介绍。