1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,千里之行,始于足下,一、关系运算符和表达式,1,、关系运算符,在程序中经常需要比较两个量的大小关系,以决定程序下一步,的工作。比较两个量的运算符称为关系运算符。在语言中有以下关系运算符:,小于,大于,=,大于或等于,=,等于,!=,不等于,关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,,=,的优先级相同,高于,=,和,!=,,,=,和,!=,的优先级相同。,第五章 选择结构程序设计,2,、关系表达式,关系表达式的一般形式为:,表达式 关
2、系运算符 表达式,例如:,a+b,c-d,x,3/2 a+1(bc),a!=(c=d),等。关系表达式的值是“真”,和“假”,用“,1”,和“,0”,表示。,如:,50,的值为“真”,即为,1,。,(a=3)(b=5),由于,35,不成立,故其值为假,即为,0,。,#include,main(),char c=k;,int i=1,j=2,k=3;,float x=3e+5,y=0.85;,printf(%d,%dn,a+5=k+1);,printf(%d,%dn,1j5,x-5.25b&cd,等价于,(ab)&(cd),!b=c|da,等价于,(!b)=c)|(dc&x+yc)&(x+y)0
3、42,由于,50,为真,,42,也为真,,&,结果为真。,加速法则:若,0&x,,则,x,不进行运算。,2.,或运算,|,参与运算的两个量只要有一个为真,结果就为真。两个量都,为假时,结果为假。,例如:,50|58,由于,50,为真,,|,结果也就为真。,加速法则:若,1|x,,则,x,不进行运算。,3.,非运算,!,参与运算量为真时,结果为假;参与运算量为假时,结果为,真。例如:,!(50),的结果为假。,虽然编译在给出逻辑运算值时,以“,1”,代表“真”,“,0”,代表“假”。但反过来在判断一个量是为“真”还是为“假”时,,以“,0”,代表“假”,以非“,0”,的数值作为“真”。,例如:
4、由于,5,和,3,均为非“,0”,因此,5&3,的值为“真”,即为,1,。,又如:,5|0,的值为“真”,即为,1,。,3,、逻辑表达式,逻辑表达式的一般形式为:,表达式 逻辑运算符 表达式,其中的表达式可以又是逻辑表达式,从而组成了嵌套的情形。例如:,(a&b)&c,根据逻辑运算符的左结合性,上式也可写为:,a&b&c,逻辑表达式的值是式中各种逻辑运算的最后值,以“,1”,和“,0”,分别代表“真”和“假”。,#include,main(),char c=k;,int i=1,j=2,k=3;,float x=3e+5,y=0.85;,printf(%d,%dn,!x*!y,!x);,pri
5、ntf(%d,%dn,x|i,printf(%d,%dn,i=5,本例中,!x,和,!y,分别为,0,,,!x*!y,也为,0,,故其输出值为,0,。由于,x,为非,0,,故,!x,的逻辑值为,0,。对,x|i&j-3,式,先计算,j-3,的值,为非,0,,再求,i&j-3,的逻辑值为,1,,故,x|i&j-3,的逻辑值为,1,。,对,ij&xy,式,由于,ij,的值为,1,,而,xy,为,0.,故表达式的值为,1,,,0,相与,最后为,0,,对,i=5&c&(j=8),式,由于,i=5,为假,即值为,0,,,该表达式由两个与运算组成,所以整个表达式的值为,0,。对于式,x+y|i+j+k,由
6、于,x+y,的值为非,0,,故整个或表达式的值为,1,。,4.2,单分支和双分支选择结构程序设计,4.2.1,简单,if,语句,if(,表达式,),语句;,条件语句,用,if,语句可以构成分支结构。它根据给定的条件进行判断,以,决定执行某个分支程序段。语言的,if,语句有三种基本形式。,1.,第一种形式为基本形式,if(,表达式,),语句;,其语义是:如果表达式的值为真,则执行其后的语句,否则不执,行该语句。,#include,main(),int a,b,max;,printf(n input two numbers:);,scanf(%d%d,max=a;,if(maxb)max=b;,p
7、rintf(max=%d,max);,例,:,main(),int a,b,max;,printf(n input two numbers:);,scanf(%d%d,max=a;,if(maxb),printf(max=%dn,a);,else,printf(max=%dn,b);,例,:,3.,第三种形式为,if-else-if,形式,前二种形式的,if,语句一般都用于两个分支的情况。当有多个分,支选择时,可采用,if-else-if,语句,其一般形式为:,if(,表达式,1),语句,1,;,else if(,表达式,2),语句,2,;,else if(,表达式,3),语句,3,;,els
8、e if(,表达式,m),语句,m,;,else,语句,n,;,其语义是:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个,if,语句之外继续执行程序。如果所有的表达式均为假,则执行语句,n,。,然后继续执行后续程序。,#include,main(),char c;,printf(input a character:);c=getchar();,if(c=0&c=A&c=a&cb),a+;,b+;,else,a=0;,b=10;,5,、语句的嵌套,当,if,语句中的执行语句又是,if,语句时,则构成了,if,语句嵌套的情形。其一般形式可表示如下:,if(,表达式,),i
9、f,语句;,或者为,if(,表达式,),if,语句;,else,if,语句;,在嵌套内的,if,语句可能又是,if-else,型的,这将会出现多个,if,和多个,else,重叠的情况,这时要特别注意,if,和,else,的配对问题。例,如:,if(,表达式,1),if(,表达式,2),语句,1,;,else,语句,2,;,应该理解为:还是应理解为:,if(,表达式,1)if(,表达式,1),if(,表达式,2)if(,表达式,2),语句,1,;语句,1,;,else,语句,2,;,else,语句,2,;,为了避免这种二义性,语言规定,,else,总是与它前面最,近的,if,配对,因此对上述例子
10、应按前一种情况理解。,#include,main(),int a,b;,printf(please input A,B:);,scanf(%d%d,if(a!=b),if(ab)printf(ABn);,else printf(AB,、,AB,或,A=B,。,这种问,题用,if-else-if,语句也可以完成。而且程序更加清晰。因此,在,一般情况下较少使用,if,语句的嵌套结构。以使程序更便于阅读理,解,.,小结,if,条件语句,一,.,条件语句的一般形式为,:,真,if(,表达式,),语句,1;,else,语句,2;,语句,语句,表达式,假,例:求任一实数的绝对值,#include,stdi
11、o.h,main(),double x,xabs,;,printf,(,input a data:,);,scanf,(,%lf,if(x20|x20|x20|xb)max=a;,else max=b;,等价于,max=(ab)?a:b;,2,条件表达式,一般形式是,:,?:,求值过程是,:,先求表达式,1,的值,若为真,则求表达式,2,的值并把它作为整个表达式,的值,;,若表达式,1,的值为假,则求表达式,3,的值并把它作为,整个表达式的值。,3,说明:,),条件运算符的优先级,算术运算符,关系运算符,条件运算符,赋值运算符,(高),(低),max=(ab)?a:b;,与,max=ab?a:
12、b;,等价,y=ab?a:(b+1);,与,y=ab?a:b+1;,等价,2),条件运算符,的结合性,:,自右向左,例,:a=1,b=2,c=3,d=4,则条件表达式,a b?a:c d?c:d,的值为,4,3),条件表达式不能取代一般的,if,语句,只能取代,if,语句中特殊的一种,.,例,:,if(a b),printf,(,%d,a);,else,printf,(,%d,b);,可用,printf,(,%d,a b?a:b);,取代,.,),条件表达式中,表达式的类型可与表达式及,不同,表达式和 表达式的类型也可不同,而,条件表达式值的类型取表达式和中的较高者,例:,int,x,y;,x
13、a,:,b,值为字符型,x y?1:1.5,值为实型,例:求,a,b,c,中的绝对值最大的数,#,include,#include,main(),float a,b,c,max;,printf(“input,three data:n”);,scanf(“%f%f%f,”,if(fabs(a,),fabs(b,),max=,fabs(a,),fabs(c,)?a:c;,else,max=,fabs(b,),fabs(c,)?b:c;,printf(“a,=%.2f,b=%.2f,c=%.2f,max=%.2f”,a,b,c,max);,一般形式为,:,switch(,表达式,),case,常
14、量表达式,1:,语句,1,或空,;,case,常量表达式,2:,语句,2,或空,;,.,.,case,常量表达式,n:,语句,n,或空,;,default:,语句,n+1,或空,;,说明,:,1.,执行,switch,语句时,将表达式的值逐个与,case,后的常量,进行比较,若与其中一个相等,则执行该常量下的语句,若不与任何一个常量相等,则执行,default,后面的语句。,五、,switch,语句,2.switch,中表达式与,case,后的常量可为任何类型,3.,每一个,case,后常量表达式的值必须互不相同,否,则出现矛盾。,4.,每个,case,或,default,后的语句可以是复合语
15、句,但不需要使用,和,括起来。,执行完一个,case,后面语句后,流程控制转移到下一,个,case,继续执行因此,若想在不同情况下执行不同的,语句,必须使用,break,语句。,break,语句的功能:将程序流程控制跳出整个,switch,语句,,执行,switch,语句的下一条语句,switch(grade),case,A,:printf(85100n);break;,case,B,:printf(7084n);break;,case,C,:printf(6069n);break;,case,D,:,printf,(60n);break;,default:,printf(Errorn,);,
16、6.,多个,case,可共用一组执行语句例:,case,A,:,case,B,:,case,C,:,printf,(,60n);break;,例:,选择结构程序设计举例,例,:,将任意三个整数按从大到小的顺序输出。,#,include,stdio.h,void main(),int,x,y,z,t;,scanf(%d,%d,%d,&x,&y,&z,);,if(xy)t=x;x=y;y=t;/*,交换,x,y,的值*/,if(xz)t=x;x=z;z=t;/*,交换,x,z,的值*/,if(yc&a+cb&b+ca),if(a=b&b=c),printf(equalateral,triangle
17、n);,else if(a=b|a=c|b=c),printf(isoscelestriangle.n,);,else,printf(other,triangle.n);,else,printf(can,notn);,例,:,从键盘输入一个年份,判断是否是闰年。,#,include,stdio.h,void main(),int,year;,scanf(,%,d,&,year,);,if(year,%,400=0|(year,%,4=0,&,year,%,100!=0),printf(,%,d,is a leap yearn,year);,else,printf(,%,d,is not a
18、leap yearn,year);,1.main(),int,x=1,y=0,a=0,b=0;,switch(x),case 1:switch(y),case 0:a+;break;,case 1:b+;break;,case 2:a+;b+;break;,case 3:a+;b+;,printf(“a,=%d,b=%dn”,a,b);,结果:,a=2,b=1,课堂练习,2.,程序填空,:,以下程序判断输入的整数能否被,3,或,7,整除,.,main(),int,x,f=0;,scanf,(“%d”,if(,1,),(,2,),if(f=1),printf(“YESn,”);,else,printf(“NOn,”);,






