7.2.2 双分支结构语句
在C语言中,可以使用if-else语句实现双分支结构。双分支结构语句的功能是对一个表达式进行计算,并根据得出的结果来执行其中的操作语句。
使用双分支if语句的具体格式如下所示。
if(表达式) 语句1; else 语句2;
上述格式的含义是,如果表达式的值为真,则执行语句1,否则将执行语句2,语句1和语句2只能执行一个。其过程表示如图7-6所示。

图7-6 双分支if语句
看下面的一段代码。
#include "stdio.h" int main(void){ char c; printf("Enter a character:\n"); scanf("%c", &c); if('0'<=c&&c<='9') //如果是数字,则输出字符串Number printf("%c is Number\n", c); else if('A'<=c&&c<='Z') //如果不是数字,而是大写字母,则输出字符串Majuscule printf("%c is Majuscule\n", c); else if('a'<=c&&c<='z') //如果不是数字和大写字母,而是小写字母,则输出字符串Lowercase printf("%c is Lowercase\n", c); else if(c==' ') //如果不是数字和大小写字母,而是空格,则输出字符串Blank printf("%c is Blank\n", c); else if(c=='\n') //如果不是数字、大小写字母和空格,而是换行符,则输出字符’\n' printf("%c is '\n'\n", c); else //如果不是数字、大小写字母、空格和换行符,则输出字符串Other printf("%c is Other\n", c); }
上述代码的执行过程如图7-7所示。

图7-7 执行过程
上述代码通过双分支if语句对用户输入的字符进行判断,若判断输入的是数字、大写字母、小写字母、空格、换行符还是其他格式,并输出判断的结果,如图7-8所示。

图7-8 输出提示
在具体使用时,为了解决比较复杂的问题,有时需要对if语句进行嵌套。嵌套的位置可以固定在else分支下,在每一层的else分支下嵌套另外一个if…else语句。具体格式如下所示:
if(表达式1) 语句1; else if(表达式2) 语句2; else if(表达式3) 语句3; … else if(表达式m) 语句m; else 语句n;
上述格式的含义是:依次判断表达式的值,当某个值为真时,则执行后面对应的语句,执行完毕后跳到整个if语句之外继续执行程序。如果所有的表达式均为假,则执行语句n,然后继续执行后续程序。其过程表示如图7-9所示。

图7-9 嵌套的if-else语句
实例7-3
根据用户在键盘上输入的字符,输出此字符所属的类别
源码路径daima\7\7-3
本实例的实现文件为“123.c”,具体实现代码如下。
#include"stdio.h" int main(void){ char c; printf("input a character: "); c=getchar(); if(c<32) printf("This is a control character\n"); else if(c>='0'&&c<='9') printf("This is a digit\n"); else if(c>='A'&&c<='Z') printf("This is a capital letter\n"); else if(c>='a'&&c<='z') printf("This is a small letter\n"); else printf("This is an other character\n"); }
拓展范例及视频二维码
范例7-3-01:使用单条件双分支if语句
源码路径:演练范例\7-3-01\

范例7-3-02:由小到大排列数字
源码路径:演练范例\7-3-02\

上述代码能够判别键盘输入字符的类别。可以根据输入字符的ASCII码来判别类别。由ASCII码表可知ASCII值小于32的为控制字符。0~9的为数字,A~Z的为大写字母,a~z的为小写字母,其余则为其他字符。这是一个多分支选择问题,用if…else…if语句编程,并判断输入字符的ASCII码所在的范围,然后分别给出不同的输出。例如输入为“g”,则输出显示它为小写字符。
程序运行后先在界面中提示用户输入字符,输入一个字符并按Enter键后将在界面中输出输入值的类别,例如输入数字12后的执行结果如图7-10所示。

图7-10 输出结果
除了上述介绍的固定嵌套外,开发人员还可以根据需要进行随机嵌套。其一般形式如下。
if(表达式) if语句;
或者为:
if(表达式) if语句; else if语句;
嵌套内的if语句可能又是if…else形式的,这将会出现多个if和多个else重叠的情况,这时要特别注意if和else的配对问题。看下面的代码。
int main(void){ int a, b; printf("please input A, B: "); scanf("%d%d", &a, &b); if(a! =b) if(a>b) printf("A>B\n"); else printf("A<B\n"); else printf("A=B\n"); }
上述代码使用了if语句的嵌套结构。采用嵌套结构实质上是为了进行多分支选择,这段代码实际上有3种选择,分别是A>B、A<B和A=B。上述问题用if…else…if语句也可以完成,而且程序会更加清晰。因此,在一般情况下应该尽量少使用if语句的嵌套结构。再看下面的代码。
#include <stdio.h> int main(void){ float grade; printf("Please input student's result:\n"); scanf("%f", &grade); if(grade>=90) { printf(" A\n"); } else if ((grade>=80) && (grade<90)) { printf(" B\n"); } else if ((grade>=60) && (grade<80)) { printf("C\n"); } else { printf("D\n"); } }
上述代码可以让用户随便输入一个数字,并根据输入的数字来确定级别。