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又是一个条件表达式。