资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,谢丽聪老师C语言-5分支结构程序(2)-,5.1 关系表达式,由关系运算符、圆括号把两个表达式连接起来的式子。,表示条件,若所表示的条件成立、则其值为1(非0)、否则其值为0。,关系运算符:,、,、,=,、,=,、,!=,例:,a=2、39、a!=(a=8)、,x+(y=3)=k*z、(a!=3)(kbcd,应表示为,ab&bc&cd,不能顺手也写为 abcd,关系运算符都是双目运算符,其结合性均为,左结合。关系运算符的优先级低于算术运算符,高于赋值运算符,。,在六个关系运算符中,,=的优先级相同,高于=和!=,=和!=的优先级相同,。,5.2 逻辑表达式:,由逻辑运算符、圆括号把表达式连接起来的式子,表示条件,若所表示的条件成立、其值为1(非0)、否则其值为0,逻辑运算符:,&(与)、|(或)、!(非),&,和,|,均为,双目运算符,,,具有,左结合性,。,!,为,单目运算符,,具有,右结合性,。,逻辑运算符和其它运算符优先级的关系可表示如下:,!(非)&(与)|(或),“&”和“|”低于关系运算符,“!”高于算术运算符。,按照运算符的优先顺序可以得出:,ab&cd 等价于,(ab)&(cd),!b=c|da 等价于,(!b)=c)|(dc&x+yc)&(x+y)3,&,a=8,23,&,1,0,&,1,0,2、x+y,&,a,2,&,97,1,3、x+(y=3)=k*z,|,!a,0+3=-1,|,!a,0|0,0,4、(x!=7),|,a,0!=7|97,1|97,1,5、,!,(x+y3,&,a=8),!(23,&,1),!(0,&,1),!0,1,6、,!,(k*q),!(-1),0,7、!x,!(1),!(0),1,5.3 逻辑表达式的跳跃,作第一个,知道结果,后面不作,如:,&,&,非0,不算,0,要算,0,不 算,非0,要 算,1、执行 int a,b,c;,a=b=c=0;,+a|+b,后a、b、c值分别为1、,0,、,0,2、执行 int a=5,b=6,x=1,y=2;,(a=xy),后a、b值分别为0、,6,a=1,停止不算,值为 0 赋给a,,停止不算,3、执行 int a,b,c;a=b=c=-1;,+a,后a、b、c值分别为0、,-1,、0,1,a=0,2,不算,值为0,3,c=0,4,整体为0,例1:,main(),char c=k;,int i=1,j=2,k=3;,float x=3e+5,y=0.85;,printf(%d,%dn,!x*!y,!x);,printf(%d,%dn,x|i,printf,(%d,%dn,i=5,运行结果:0,0,1,0,0,1,0,X为非0,为非0,后面不算,为0,后面不算,为1,后面要算,5.4 选择结构(if 语句),5.4.1 if语句的三种形式,1、第一种形式为基本形式,:if,if(表达式)语句,语义:如果表达式的值为真,则执行其后的语句,否则不执行该语句。其过程可表示为下图。,表达式可以是任意合法表达式,后面不能加;,例2:void main(),int a,b,max;,printf(n input two numbers:);,scanf(%d%d,max=a;,if(maxb)max=b;,printf(max=%d,max);,输入:23 46,输出:max=46,此语句用于提示输入,max=23,max=46,例3:void main(),int a,b,c,t;,printf(n input two numbers:);,scanf(%d%d%d ,if(ab)t=a;a=b;b=t;,if(ac)t=a;a=c;c=t;,if(bb),printf(max=%dn,a);,else,printf(max=%dn,b);,输入:23 46,输出:max=46,输入两个整数,输出其中大数,例2的改写,3、第三种形式为if-else-if形式:,if(表达式1),语句1;,else if(表达式2),语句2;,else if(表达式3),语句3;,else if(表达式m),语句m;,else,语句n;,语义:,依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。如果所有的表达式均为假,则执行语句n。然后继续执行后续程序。,后面不能加;,此为真,做语句1,其它语句都不做,上面的语句为以下三种格式:,1、空语句,2、一个语句(不引起转移),3、前后加大括号的语句(复合语句),也叫程序段,如:,int a;,float b;,a=3;,b=7.0;,;,允许在复合语句前部定义变量,只能在复合语句中使用,int a;,a=3;,float b;,b=7.0;,变量要在最前面定义,不能写成,#includestdio.h,void,main(),输入:A,char c;,输出:This is a capital letter,c=getchar();,if(c=0&c=A&c=a&cb),a+;b+;,else,a=0;b=10;,if(ab),a+;b+;,;,else,a=0;b=10;,;,不能写成,复合语句,5.4.2,条件运算符和条件表达式,在条件语句中,只执行单个的赋值语句时,可使用条件表达式来实现。,条件运算符为,?,和,:,,它是一个,三目运算符,,即有三个参与运算的量。,条件表达式的一般形式为:,表达式1,?,表达式2,:,表达式3,求值规则为:,如果表达式1的值为真,则以表达式2 的值作为条件表达式的值,否则以表达式2的值作为整个条件表达式的值。,非 0,0,例如条件语句:,if(ab)max=a;else max=b;,可用条件表达式写为,:,max=(ab)?a:b;,执行该语句的语义是:,如ab为真,则把a赋予max,,如ab为,假,,则把b 赋予max。,使用条件表达式时,还应,注意,以下几点:,1)条件运算符的运算优先级低于关系运算符和,算术运算符,但高于赋值符。,因此:,max=(ab)?a:b,可以去掉括号而写为,max=ab?a:b,2)条件运算符,?和:,是,一对运算符,不能分开,单独使用,。,3)条件运算符的结合方向是,自右至左,。,例如:,ab?a:cd?c:d,应理解为,ab?a:(cd?c:d),这也就是条件表达式嵌套的情形,即其中的表达式3又是一个条件表达式。,例6:计算,方法一:,void,main(),float x,y;,scanf(”%f”,if(x3),y=x*x+2;,else,y=3*x+7*x*x;,printf(”y=%fn”,y);,x,2,+2 (x3),y=,3x+7,x,2,(x3),表达式,成立值为1,y=x3?x*x+2:3*x+7*x*x;,例7:从键盘输入任意的两个实数,按从小到大顺序输出这两个数,请编程实现。,void,main(),float a,b;,scanf(”%f%f”,if(ab),a=a+b;b=a-b;a=a-b;,/*实现a与b的互换*/,printf(”%f,%fn”,a,b);,可用语句,if(ab)float t;t=a;a=b;b=t;,代替,复合语句可以定义变量,a=a+b;b=a-b;a=a-b,t=a;a=b;b=t,a,3+1,b,a-b=3,a,a-3=1,a,3,b,1,t,3,b,3,a,1,a,3,b,1,例8:P105 5.5 计算,方法一:,main(),float x,y;,scanf(”%f”,if(x1),y=x;,else,if(,1=x&,x10),y=2*x-1;,else,y=3*x-11;,printf(”y=%fn”,y);,表达式1,表达式2,非0,0,语句1,语句2,语句3,非0,0,1=x&可省略吗?,可以,方法二:,void,main(),float x,y;,scanf(”%f”,if(x1)y=x;,else,if(x10)y=2*x-1;else y=3*x-11;,printf(”y=%fn”,y);,、,可省略,y=x1?x:,(,x10?2*x-1:3*x-11,),;,等,价,(,、,),可省略,方法三:,if(x10),if,(,x1,),y=x;,else y=2*x-1;,else y=3*x-11;,后不能加,;,、,和,(、),可一起省略,等,价,y=x10?(x1?x:2*x-1):3*x-11;,若上面分段函数改为,则程序改为,void,main(),float x,y;,scanf(”%f”,if(x20),printf(”输入的数据是错误的”);,else if(,-2x&,x1)y=x;,else if(,1=x&,x10)y=2*x-1;,else y=3*x-11;,printf(”y=%fn”,y);,此语句出错与否都输出,此程序有否缺陷?,程序应改为,void,main(),float x,y;,scanf(”%f”,if(x20),printf(”输入的数据是错误的”);,else,if(,-2x&,x1),y=x;printf(”y=%fn”,y);,else,if(1=x&x10),y=2*x-1;printf(”y=%fn”,y);,else y=3*x-11;printf(”y=%fn”,y);,
展开阅读全文