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

4.3 if语句

在C语言中可以用if语句构成选择结构。if语句的语义是,根据给定条件的值,以决定执行某个分支程序段,所以也称为条件语句。

4.3.1 if语句的3种形式

1.基本if语句

基本if语句的格式为:

            if(表达式) 语句;

这是if语句最简单的一种形式。其中,if是关键字标识符;表达式可以是任何类型的表达式,但两侧的括号不能省略;语句称为if的内嵌语句,也叫if子句,可以是任何符合C语言语法的语句,但应是逻辑上的一条语句。如果if子句需要多条语句,则应写成复合语句的形式,使其在语法上作为一条语句,这是复合语句的重要语法作用之一。

该语句的语义是,如果表达式的值为非0(真),则执行if子句;否则跳过if子句,执行if语句的后续语句。参见图4.1。

例如:

            if(x>0)printf("%f\n",sqrt(x));       /* sqrt()是求平方根的标准函数 */

【例4.3】 输入两个整数,输出其中较大的数。

分析:定义3个整型变量a、b和max,其中a、b用于表示从键盘输入的任意两个整数, max表示其中较大的数。首先假设a是较大的数,即先把a赋予变量max,再用基本if语句判别max和b的大小,如果max小于b,则把b赋予max。因此,max中总是较大的数,最后输出max的值,其N-S流程图如图4.2所示。

图4.1 基本if语句的语义

图4.2 例4.3的N-S流程图

程序代码如下:

            /* 输入两个整数,输出其中较大的数 */
            #include "stdio.h"
            main( )
            {
              int a,b,max;
              printf("\n input two numbers: ");
              scanf("%d,%d",&a,&b);
              max=a;
              if (max<b) max=b;
              printf("max=%d\n",max);
            }

程序运行结果如下:

            输入: 4,3
            输出: max=4

【例4.4】 分析下面程序的输出结果。

            #include"stdio.h"
            main()
            {
                int a,b,t;
                printf("\n input two numbers:");
                scanf("%d,%d",&a,&b);
                printf("%d,%d\n",a,b);
                  if(a<b)
                  {
                      t=a;
                      a=b;
                      b=t;
                  }
                printf("%d,%d\n",a,b);
            }

请思考,如果将上例中if子句的大括号去掉,程序的运行结果是什么?

2.if-else语句

if-else语句的格式为:

            if(表达式)
                    语句1;
            else
                    语句2;

该语句的语义是,如果表达式的值为非 0(真),则执行语句1;否则执行语句2,见图4.3。语句1和语句2也称为if子句和else子句,它们应是逻辑上的一条语句。

对于例4.3,也可以只定义两个变量a和b,利用if-else语句实现程序要求。如果a>b,则输出a,否则输出b。改写例4.3的程序代码如下:

图4.3 if-else语句的语义

            /* 输入两个整数,输出其中较大的数 */
            #include"stdio.h"
            main()
            {
                int a,b;
                printf("input two numbers:");
                scanf("%d,%d",&a,&b);
                if(a>b)
                    printf("max=%d\n",a);
                else
                    printf("max=%d\n",b);
            }

3.if-else if-else语句

if-else if-else语句的格式如下:

            if(表达式1)
              语句1;
            else if(表达式2)
              语句2;
            else if(表达式3)
              语句3;
              ……
            else if(表达式n-1)
              语句n-1;
            else
              语句n;

该语句的语义是,依次判断各表达式的值,当出现某个表达式的值为非 0(真)时,则执行其对应的内嵌语句,然后跳到整个 if 语句之外继续其后续语句,如果所有表达式均为 0 (假),则执行else子句(语句n),然后继续执行后续语句,参见图4.4。

图4.4 if-else if-else语句的语义

例如:

            if(number>100)
                    cost=0.15;
            else if(number>50)
                    cost=0.10;
            else if(number>10)
                    cost=0.075;
            else
                    cost=0;

【例4.5】 编写程序判断从键盘输入的字符是控制字符、数字字符、大写英文字母、小写英文字母,还是其他字符。

分析:定义一个字符型变量c,接收从键盘输入的字符,然后根据c的ASCII码来判别输入字符的类型。从ASCII码表可知,控制字符的ASCII码值小于32,数字字符“0”到“9”的ASCII码值在48~57范围内,大写英文字母“A”到“Z”的ASCII码值在65~91范围内,小写英文字母“a”到“z”的ASCII码值在97~123范围内,其余则为其他字符。这是一个多分支选择的问题,可利用if-else if-else语句判断c的ASCII值所在的范围,分别给出不同的输出。

程序代码如下:

            #include"stdio.h"
            main()
            {
                char c;
              printf("input a character:");
              c=getchar(); /* 也可使用语句:scanf("%c",&c); */
                    if(c<32)
                      printf("This is a control character\n");
                    else if(c>=48&&c<=57)
                      printf("This is a digit\n");
                    else if(c>=65&&c<=91)
                      printf("This is a capital letter\n");
                    else if(c>=97&&c<=123)
                      printf("This is a small letter\n");
                    else
                      printf("This is an other character\n");
            }

程序运行结果如下:

            输入: a
            输出: This is a small letter

因为在C语言中,字符型数据和整型数据通用,所以例4.5中的if语句也可改写为下列形式:

            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");

【例4.6】 已知学生的百分制成绩,编写程序按百分制分数进行分段评定,分出相应的等级:

● 如果分数大于等于90,则评定为A;

● 如果分数在80~89范围内,则评定为B;

● 如果分数在70~79范围内,则评定为C;

● 如果分数在60~69范围内,则评定为D;

● 如果分数小于60,则评定为E。

分析:这是一个典型的多分支选择问题。定义一个实型变量score表示从键盘输入的学生百分制成绩,定义一个字符型变量grade表示相应的等级,用if-else if-else语句判断分数所在的范围,给字符型变量grade赋予相应的评定等级值,最后输出score和gread的值。

程序代码如下:

            #include"stdio.h"
            main()
            {
                    double score;char grade;
                    printf("Please input the student's score:");
                    scanf("%lf",&score);
                    if(score>=90)
                      grade='A';
                    else if(score>=80)
                      grade='B';
                    else if(score>=70)
                      grade='C';
                    else if(score>=60)
                      grade='D';
                    else
                      grade='E';
                    printf("%lf,%c\n",score,grade);
            }

程序运行结果如下:

            输入:85
            输出:85.000000,B

4.在使用if语句时应注意的问题

① 在if语句的3种形式中,if关键字之后必须有一对括号,把表示判断条件的表达式括起来。

② 在if语句的3种形式中,表示判断条件的表达式通常是关系表达式或逻辑表达式,也可以是其他表达式,如算术表达式、赋值表达式等,还可以是单个常量或变量(单个常量或变量可看成是表达式的特殊情况)。C语言关心的只是表达式的值是0还是非0而不是表达式的形式,所以只要表达式的值为非0,就执行其后的内嵌语句。

例如:

            if(a=b)     /* 表示条件的表达式是赋值表达式 */
                    printf("%d",a);
            else
                    printf("a=0");

本语句的语义是,把b值赋予a,如果为非0则输出该值,否则输出"a=0"字符串。

③ 在if语句的3种形式中,所有的内嵌语句应为单个语句,如果希望在满足条件时执行一组(多个)语句,则必须把这一组语句用一对大括号“{}”括起来组成一个复合语句,但要注意在右大括号“}”之后不能再加分号。

例如,下列语句完成“如果a>b,则将a和b的值交换”的功能:

            if(a>b)
            {t=a;a=b;b=t;}

④ 无论if语句的形式如何,从C语言的语法上来说,它们都是一条完整的控制语句。

4.3.2 if语句的嵌套

C语言允许if语句嵌套,即在if语句的内嵌语句中出现一个或多个其他的if语句,这种形式被称为if语句的嵌套结构。采用嵌套结构的实质其实是为了实现多分支选择。嵌套结构的一般形式可表示如下:

            if(表达式1)
                    if( 表达式2)语句1;         /* 内嵌if 语句 */
                    else  语句2;
            else
                    if(表达式3) 语句3;            /* 内嵌if 语句 */
                    else语句4;

该语句的语义是,如果表达式1和表达式2的值均为非0,则执行语句1;如果表达式1的值非0,而表达式2的值为0,则执行语句2;如果表达式1的值为0,而表达式3的值为非0,则执行语句3;如果表达式1和表达式3的值均为0,则执行语句4。所以该语句实现了4个分支的选择。

由于if语句有多种形式,所以其嵌套形式也有多种,根据实际情况可实现多种分支选择结构。在使用if的嵌套形式时应当注意的是if与e1se的配对关系。根据C语言的语法,关键字if可以没有对应的关键字else(基本if语句),但关键字else必须要有对应的关键字if。C语言规定从最内层开始,e1se总是与位于它前面最近的(未曾配对的)if配对。

【例4.7】 用if语句的嵌套形式完成下列分段函数的计算:

分析:这是一个3分支问题,从键盘得到x的值,根据x值的范围求出函数y的值并输出。程序代码如下:

            #include"stdio.h"
            main()
            {
                    double x,y;
                    scanf("%lf",&x);
                    if(x!=0)
                      if(x>0)      /* 嵌套的if-else语句 */
                  y=1;
                      else
                  y=1;
                    else
                  y=0;
                    printf("%lf,%lf",x,y);
            }

程序运行结果如下:

            输入:10
            输出:10.000000,1.000000

程序中使用了if-else语句结构,其中的if子句又是一个if-else语句结构。

4.3.3 条件运算符和条件表达式

在if-else语句中,当if子句和else子句都只是给同一个变量赋值的单个赋值语句时,可以使用C语言提供的条件表达式来代替if-else语句,实现给变量赋值的目的。这样不但使程序简洁,也提高了运行效率。条件表达式的一般形式为:

            表达式1?表达式2:表达式3

其中,“?:”为条件运算符,它们是一对三目运算符,不能分开单独使用。条件运算符的优先级低于关系运算符和算术运算符,但高于赋值运算符。结合方向为右结合性。

条件表达式的求值规则为,先求解表达式1,如果表达式1的值为非0,则条件表达式的值为表达式2 的值,否则为表达式3的值。

条件表达式通常用于赋值语句之中。

例如,下列if-else语句实现了将a和b中较大的数赋给max。

            if(a>b)
              max=a;
            else
              max=b;

改写上述if-else语句为如下赋值语句:

            max=(a>b)?a:b;     /* 利用条件表达式给变量max赋值 */

该语句的语义为,如a>b为真,则把a赋予max,否则把b赋予max。

例4.7中的分段函数的计算也可以用条件表达式实现给变量y赋值,请看下列赋值语句:

            Y=x>0?1:x==0?0:-1

该语句应理解为:

            Y=x>0?1:x==0?0:-1

这是条件表达式嵌套的情形,即其中的表达式3又是一个条件表达式。