1、04第四章 选择结构第四章 选择结构引言:分支结构,根据逻辑判断的结果决定程序的不同流程。(根据不同的条件执行不同的分支)1关系运算和逻辑运算C语言中的逻辑值:真:非0表示真 1 -1 1.5 a 1 假: 0 0 (1) 关系运算符和关系表达式比较运算,进行两个数的比较,判断比较的结果是否符合条件 = =b 0 (a=3)(b=4) 0 ac=c 0 (a+)b 1 a=97 1 注:关系运算符两边值类型不一致时,系统自动进行类型转换; a=97若x,y定义为double.避免使用x=y来判断两个数是否相等。因为存放在内存中的浮点数是有误差的,x=y结果总为0. 可用:fabs(x-y)0
2、xyx-y0 xyx-y=0 x=y fabs(x-y)1e-6 math.h(2) 逻辑运算符和逻辑表达式 & | !注:&和|是双目运算符,!是单目运算(!a)优先级 ! & |&:两个都为真则结果为真 -1&0|:有一个为真则结果为真 0|0 !:真变假,假变真 !0 !-2 &:两边都为真时,结果为真。有一个为假则结果为假。(左为假短路右边)。int a=1,b=0; a+&b+ b=? 1int a=0,b=0; a+&b+ b=? 0|:有一个真,则结果为真。(左为真短路右边)。int a=1,b=0; a+|b+ b=? 0int a=0,b=0; a+|b+ b=? 1短路:出
3、现在特定情况下,此时不可以用一般的思维方式按优先级考虑。&:左为假短路右边。左为真必须看右边|:左为真短路右边。左为假必须看右边。#includemain()int a=0,b=5,c; c=ab|+b; printf(“%d %dn”,c,b); 数学式:0x10 C语言:0x10 110 1 010 1 0-510 1 0510 1 0150&x=a&x=A&x=0&x = 2 1&2 1+2 1 1.0 1 0语法上只能是一条语句,若该if子句包含多条语句,则必须用复合语句 t=a;a=b;b=t;代码:if(ab) t=a;a=b;b=t; printf(“ok”);执行过程:if(表
4、达式) if子句;其它语句;举例:输入两个数,分别放入x和y中,若两个数不相等,则输出其中的大数;若两数相等,则输出字符串x=y和y 的值。#includemain()int x,y; scanf(“%d%d”,&x,&y); if(xy) printf(“%dn”,x); if(xy) printf(“%dn”,y); if(x=y) printf(“x=y %dn”,y);输入三个数,分别放在变量a,b,c中,然后把输入的数据重新按由小到大的顺序放在变量a,b,c中,最后输出a,b,c中的值。#includemain()int a,b,c,t; scanf(“%d%d%d”,&a,&b,&
5、c);3 1 2 if(ab) t=a;a=b;b=t; 1 3 2 if(ac) t=a;a=c;c=t; if(bc) t=b;b=c;c=t; 1 2 3 printf(“%d %d %dn”,a,b,c);2 含else子句的if语句语句形式:if(表达式) if子句; else else子句;注:if子句与else子句语法上只能是一条语句,若有多条则应用复合 语句。else是if语句的一部分,是一个整体。else不可以单独出现。 if-else代码:if(ab) printf(“%d”,a); a+;else prinf(“%d”,b);b+;printf(“ok”); 执行过程:举
6、例:编写程序,输入一个数,打印它是偶数(even )还是奇数(odd)。3 关于if语句的一些说明表达式:C语言中任意一个合法的表达式或任意类型的数据,但括号里不可为空分号(2) 嵌套的if语句if子句和else子句可以是任意合法的C语句,故当然可以是if语句。所以if语句可以内嵌在if子句中也可以内嵌在else子句中。在if子句中嵌套ifelse语句if(表达式) if(表达式) if子句; else else子句;else else子句;int a=3,b=2,c=1;if(ac) printf(“*”); else printf(“&”);else printf(“%”);printf(
7、“end”);在if子句中嵌套不含else子句的if语句if(表达式) if(表达式) if子句; else else子句;注:括号不可省,因为c语言中规定else总是与前边最近的且不带else的if结合,与它的书写格式无关。int a=3,b=2,c=1;if(ac) printf(“*”);else printf(“&”);printf(“end”);在else子句嵌套ifelseif(表达式) 外层if子句;else if(表达式) 里层if子句; else 里层else子句;int a=3,b=2,c=1; if(ab) printf(“*”);else if(ac) printf(“
8、&”); else printf(“%”);printf(“end”);在else子句中嵌套不含else的if语句if(表达式) 外层的if子句else if(表达式) if子句;int a=3,b=2,c=1;if(ab) printf(“*”);else if(a=90 A60 E6089 80-89 B 70-79 C 60-69 D#includemain()int score; scanf(“%d”,&score); if(score=90) printf(“%d A”,score); else if(score=80) printf(“%d B”,score);else if(sc
9、ore=70) printf(“%d C”,score); else if(score=60) printf(“%d D”,score); else printf(“%d E”,score);2. 条件表达式构成的选择结构根据不同的条件使用不同的运算对象参与运算。条件运算符: ? :唯一三目运算符格式:表达式1?表达式2:表达式3优先级:倒数第三 结合方向:自右向左执行: 表达式1 真 表达式2 假 表达式3int a=5,b=4,c=2,d=2,e=1;ab?a:b 4if(ab) printf(“%d”,a);else printf(“%d”,b); ab?c:de?d:e 1a2 a&b
10、 !a a a 1.0+2 非法 (2)常量表达式:可以是一个整数,一个整数常量表达式或一个字符型常量。其类型必须与switch后圆括号中表达式值的类型保持一致。int a=1,b=2;1 1+2 a 0 合法a b a+b 非法(3)case语句标号: 各case 语句标号值不可重复。各case语句和default语句的书写顺序无先后限制。有时switch语句体中也可以没有default语句。(4)case语句标号后的语句:可以是零条一条或多条。(5)case与常量表达式间要有空格case 0: case 10: (6)内嵌语句举例:int a=1,b=2,c=3;switch(a) cas
11、e 1: switch(a&b) case 0:printf(“A”); case 1:printf(“B”);break; break;case 2:printf(“#”);case 3: case 4: switch(c) case 0:printf(“a”); case 1:printf(“b”); default : printf(“c”); 执行过程:(1)计算switch后表达式的值(2)在switch语句体中与该值相同的case标号,若有相同的case标号则从该标号开始执行各语句直到switch结束;若无相同的case标号再看有无default标号,若有则从default标号开始
12、直到switch结束,若无default标号则跳过switch语句体到其后的语句。程序举例:根据输入的学生成绩给出相应的等级,90分以上为A,其它成绩10分为一个等级,60分以下为E.(成绩为整型数)0-100=90 A 9 10 60 E default60-8980-89 B 870-79 C 760-69 D 6#includemain()int x;scanf(%d,&x); switch(x/10) case 10: case 9: printf(%d An,x);break; case 8: printf(%d Bn,x);break; case 7: printf(%d Cn,x
13、);break; case 6: printf(%d Dn,x);break; default : printf(%d En,x);switch语句中使用break语句:间断语句,break可出现在switch中的任何位置,当执行break语句时,立即跳出了它所在的switch语句体4. 语句标号和goto语句概念:标号为任意合法的标识符形式:标识符:flag1: 12:作用:标号用作goto语句的转向目标概念:goto语句叫无条件转向形式:goto 语句标号;作用:把程序的执行语句转向标号所在的位置, 一般情况下,goto语句和语句标号在同一个函数内stop: printf(“endn”);.goto stop;.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1