if语句是专用于实现选择结构的语句,它根据逻辑条件的真假执行两种操作中的一种。4.2.1if语句的三种基本形式C语言提供了三种形式的if语句:1.if(表达式)可以是任意表达式语句1;else语句2;在这里,“语句1”称为if子句,“语句2”称为else子句,这些子句只允许是一条语句。需要多条语句时,应该使用花括号把这些语句括起来组成复合语句。【例4.1】输入a、b两个整数,输出其中较大的一个数。【例4.2】输入一个实数,求它的绝对值。注意:double为双精度实型数据,在输入输出时应使用格式控制符”%lf”。2.if(表达式)语句;与第一种if-else语句相比,该语句不包含else子句。其语义是:如果表达式的值为真,则执行其后的语句,否则不执行该语句,执行if的后续语句。【例4.3】输入a、b两个整数,输出其中较大的一个数(打擂台)。(3个数呢)【例4.6】:编写程序,输出符号函数。#includestdio.hmain(){intx,y;scanf(%d,&x);if(x0)y=-1;if(x==0)y=0;if(x0)y=1;printf(y=%d\n,y);}3.if(表达式1)语句1;elseif(表达式2)语句2;elseif(表达式3)语句3;……elseif(表达式m)语句m;else语句m+1;前两种形式的if语句一般都用于两路分支的情况。当有多路分支选择时,可采用以上if-else-if语句形式。其语义是:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。如果所有的表达式均为假,则执行语句m+1。然后继续执行后续程序。【例】:输入学生成绩的百分制分数,打印出对应的等级(A、B、C、D、E)。对应关系如下表所示。等级90~10080~8970~7960~690~59分数段ABCDE#includestdio.hmain(){intscore;printf(Enterscore:);scanf(%d,&score);printf(score=%d,,score);if(score=90)printf(gradeisA.\n);elseif(score=80)printf(gradeisB.\n);elseif(score=70)printf(gradeisC.\n);elseif(score=60)printf(gradeisD.\n);elseprintf(gradeisE.\n);}说明:该程序中按照程序由高到低、分段筛选输出的设计方法,其中四个判断表达式:score=90、score=80、score=70、score=60的前后顺序环环相扣,不能随意改变,否则将得不到正确的结果。该例题还可以使用if语句的平行形式进行设计。方法二:条件精确if(score=0&&score60)printf(“不及格);if(score=60&&score70)printf(“及格);if(score=70&&score80)printf(中等)if(score=80&&score90)printf(“良好);if(score=90&&score=100)printf(“优秀.\n);该程序中的五个if语句是平行的,每个if后面的表达式互相独立、互不相干,它们之间的顺序可以任意调换,不会影响结果。说明:⑴在执行if语句时先对表达式求解,若表达式的值为0,按“假”处理,若表达式值为非0,按“真”处理,执行指定的语句。例如有以下if语句:if(5)printf(OK);是合法的,输出结果为“OK”,因为表达式的值是一个非0值,按“真”处理。由此可见,表达式的类型不限于逻辑表达式,可以是多种类型(包括整型、实型、字符型、指针型数据等)。例如:下面的if语句也是合法的:if('a')printf(%d,'a');执行结果是:输出的’a’的ASCII码97。⑵在第二、第三种形式的if语句中,在每个else前面有一个分号,整个语句结束处也有一个分号。在C语言中,else子句不能作为语句单独使用,它必须是if语句的一部分,与if配对使用,(有else必有if)⑶if和else后面的语句可以是一个简单语句,也可以是有多个简单语句构成的复合语句,此时需要用“{}”将几个语句括起来成为一个复合语句。【例4.7】输出符号函数。4.3.2if语句的嵌套以上我们介绍了三种形式的if语句,每种语句部分又可以是其他的if语句,这种结构称为嵌套if语句。嵌套的if语句是一种逻辑结构比较复杂的语句,如果在程序中要处理多分支,可以考虑嵌套if语句。一般形式如下:if()内嵌if语句if()语句1else语句2else内嵌if语句if()语句3else语句4应当注意if与else的配对关系。else总是与它上面最近的未曾参与配对的if配对,与书写格式无关。例如写成:if()if()语句1else语句2编程者把else写在与第一个if(外层if)同一列上,希望else与第一个if对应,但实际上else是与第二个if配对,因为它们相距最近。如果if与else的数目不一样,为实现程序设计者的意图,可以加花括号来确定配对关系。例如:if(){if()语句1}(内嵌if)else语句2【例4.6】:编写程序,输出符号函数。#includestdio.hmain(){intx,y;scanf(%d,&x);if(x=0)if(x0)y=1;elsey=0;elsey=-1;printf(x=%d,y=%d\n,x,y);}(配对关系)1:main(){inta=2,b=-1,c=2;If(ab)if(bc)c=0;elsec+=1;printf(“%d”,c);}2:写出程序对应的函数关系:y=-1;if(x!=0)if(x0)y=1;elsey=0printf(“%d”,c);}3:当a=1,b=2,c=3时,下面if语句执行后,a,b,c的值分别为:if(ac)b=a;a=c;c=b;4.4混合运算与强制类型转换4.4.1混合运算字符型数据、整形数据(包括int、short、long)和实型数据(包括float、double)可以混合运算。例如:10.0+'a'+1-8765.4321*'b'是合法的。在进行运算时,不同类型的数据要先转换成同一类型,然后进行计算。转换规则简单如下:1:短整型------长整型,例如:3+2.0=5.02:有符号-----无符号4.3.2强制类型转换强制类型转换是通过类型转换运算来实现的。其一般形式为:(类型说明符)(表达式)其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。例如:(float)a把a转换为实型(int)(x+y)把x+y的结果转换为整型。在使用强制转换时应注意以下问题:⑴类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。⑵无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。只是在运算中进行强制转换,并不是类型改变【例4.9】#includestdio.hmain(){floatf=5.75;inti;i=(int)f;printf(i=%d,f=%f\n,i,f);}运行结果如下:i=5,f=5.750000f的类型仍为float型,值仍等于5.75。从上可知,有两种类型转换,一种是在运算时不必用户指定,系统自动进行的类型转换,如3+6.5,我们称为自动转换。第二种是强制类型转换。当自动转换不能实现目的时,可以用强制类型转换。如“%”运算符要求其两侧都是整形量,若x为float型,则“x%3”不合法,必须用:“(int)x%3”。此外,在函数调用时,有时为了使实参与形参类型一致,可以用强制类型转换运算符得到一个所需类型的参数。4.4switch语句if语句只有两个分支可供选择,而实际问题中常常需要用到多分支的选择结构。例如,学生成绩分类(90分以上为A,80-89为B,70-79为C,60-69为D,60以下为E);企业发放奖金根据利润提成等等。这些问题可用嵌套的if语句来处理,但如果分支增多,则嵌套的if语句层数增多,程序冗长而且可读性降低。C语言中的switch语句可方便处理这种多分支选择。它的一般形式如下:switch(表达式){case常量表达式1:语句1case常量表达式2:语句2……case常量表达式n:语句ndefault:语句n+1}在switch语句执行时,首先计算紧随其后的一对括号中的表达式的值,然后在switch语句体内寻找与该值吻合的case标号,如果有与该值相等的标号,则执行该标号后开始的各语句,包括在其后的所有case和default中的语句,直到switch语句体结束。如果没有与该值相等的标号,并且存在default标号,则从default标号后的语句开始执行,直到switch语句体结束。如果没有与该值相等的标号,且不存在default标号,则跳过switch语句体,不做任何操作。说明:(1)switch是c语言关键字,switch后面用花括号括起来的为switch语句体。(2)紧跟在switch后的一对圆括号中的表达式可以是整型表达式,也可以是字符型表达式,表达式两边的()不能省。(3)各case语句的标号值应该互不相同。(4)case与常量表达式之间有空格,例如case10,不能写成case10.【例4.10】:输入学生成绩的等级(A、B、C、D、E),打印出对应的百分制分数段。对应关系如下表所示。Main(){chargrade;Scanf(“%c”,&grade);switch(grade){case'A':printf(gradeA:90--100\n);case'B':printf(gradeB:80—89\n);case'C':printf(gradeC:70—79\n);case'D':printf(gradeD:60—69\n);case'E':printf(gradeE:60\n);}}如果输入A,则程序结果?可以用break解决这个问题。main(){chargrade;scanf(“%c”,&grade);switch(grade){case‘A’:printf(“gradeA:90--100\n”);break;case‘B’:printf(“gradeB:80—89\n”);break;case'C':printf(gradeC:70—79\n);break;case‘D’:printf(“gradeD:60—69\n”);break;case'E':printf(gradeE:60\n);break;}}(5)必要时,case标号后的语句可以省略不写。main(){intcj;scanf(“%d”,&cj);switch(cj/10){case10:case9:printf(“A\n”);break;case8:printf(“B\n”);break;case7:printf(“C\n”);break;case6:printf(“D\n”);break;default:printf(“E\n”);}}输入100时,程序运行的结果?输入45呢?(6)default代表所有case标号以外的那些标号,default的位置可以在任意位置,也可以没有default标号。#includestdio.hmain(){inti;scanf(%d,&i);switch(i){default:printf(您选择错误!);case1:printf(您选择的是1答案);case2:printf(您选择的是2答案);case3:printf(您选择的是3答案);case4:printf(您选择的是4答案);}}default放在前面,输出的内容是什么?如果放在最后呢?放在中间呢?(br