版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章第四章 逻辑运算和判别选取控制逻辑运算和判别选取控制41 关系运算符和关系表达式关系运算符和关系表达式是逻辑运算中比较简单的一种。所谓是逻辑运算中比较简单的一种。所谓“实践上是实践上是“比较运算。将两个值进展比比较运算。将两个值进展比较,判别比较的结果能否符合给定的条件。例如,较,判别比较的结果能否符合给定的条件。例如,a3是一个关系表达式,大于是一个关系表达式,大于号是一个关系运算符,假设号是一个关系运算符,假设a的值为的值为5,那么满足给定的,那么满足给定的“a3条件,因条件,因此关系表达式的值为此关系表达式的值为“真即真即“条件满足;假设条件满足;假设a的值为的值为2,不满足,不满
2、足“a3条件,那么称关系表达式的值为条件,那么称关系表达式的值为“假。假。14.1.1 关系运算符及其优先次序关系运算符及其优先次序 C言语提供言语提供6种关系运算符:种关系运算符: (1) 小于小于 (2) 大于大于 (4) = 大于或等于大于或等于 (5) = = 等于等于 (6) != 不等于不等于关于优先次序:关于优先次序:1前前4种关系运算符,种关系运算符,的优先级别一样,的优先级别一样,后两种也一样。前后两种也一样。前4种高于后种高于后2种。例如,种。例如,“优先于优先于“=。而。而“与与“优优先级一样。先级一样。 2关系运算符的优先级低于算术运算符。关系运算符的优先级低于算术运算
3、符。 3. 关系运算符的优先级高于赋值运算符。关系运算符的优先级高于赋值运算符。 高高 低低 算术运算符算术运算符 关系运算符关系运算符 赋值运算符赋值运算符例如:例如:ca+b 等效于等效于 c(a+b) ab!=c 等效于等效于 (ab)!=c a=bc 等效于等效于 a=bb, abbc,a3b=5,ab,abbc关系表达式的值是一个逻辑值,即关系表达式的值是一个逻辑值,即“真或真或“假。例如,关系表达式假。例如,关系表达式“53的的值为值为“假假“5=0的值为的值为“真。真。C言语没有逻辑型数据言语没有逻辑型数据Pascal言语以言语以True表示表示“真,以真,以Fa1se表示表示“
4、假。假。PASCAL和和FORTRAN等言语都有逻辑型变量和逻辑等言语都有逻辑型变量和逻辑型常量,以型常量,以1代表代表“真,以真,以“0代表代表“假。例如,假设假。例如,假设a=3,b=2,c=1,那么:,那么: ab的值为真的值为真,表达式的值为表达式的值为1。ab=c的值为的值为“真由于真由于ab的值为的值为1,等于,等于c的值,表达式的值为的值,表达式的值为1。 bca的值为的值为“假,表达式的值为假,表达式的值为0。 假设有以下赋值表达式:假设有以下赋值表达式: dab d的值为的值为1。 fabc f的值为的值为0由于由于“运算符是自左至右的结合方向,先执行运算符是自左至右的结合方
5、向,先执行“ab,得值为,得值为1,再执行关系运算:,再执行关系运算:“1c得值得值0,赋给,赋给f3 42逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式用逻辑运算符将关系表达式或逻辑量衔接起来就是逻辑表达式。用逻辑运算符将关系表达式或逻辑量衔接起来就是逻辑表达式。下面引见下面引见C言语中的逻辑运算符和逻辑运算。言语中的逻辑运算符和逻辑运算。4.2.1逻辑运算符及其优先次序逻辑运算符及其优先次序 C言语提供三种逻辑运算符:言语提供三种逻辑运算符: 1& 逻辑与相当于其它言语中的逻辑与相当于其它言语中的AND 2| 逻辑或相当于其它言语中的逻辑或相当于其它言语中的OR 3 ! 逻辑非相当于
6、其它言语中的逻辑非相当于其它言语中的NOT &和和|是是“双目元运算符,它要求有两个运算量操作数,如双目元运算符,它要求有两个运算量操作数,如ab&xy,ab|xy。“!是!是“一目元运算符,只需求一目元运算符,只需求有一个运算量,如!有一个运算量,如!ab。 逻辑运算举例如下:逻辑运算举例如下: a&b 假设假设a,b为真,那么为真,那么a&b为真。为真。 a|b 假设假设a,b之一为真,那么之一为真,那么a|b为真。为真。 !a 假设假设a为真,那么为真,那么!a为假。为假。4 下表为逻辑运算的“真值表。用它表示当a和b的值为不同组合时,各种逻辑运算所得到的
7、值。 a b !a !b a&b a|b T T F F T T T F F T F F 在一个逻辑表达式中假设包含多个逻辑运算符,如 !a&b|xy&c 优先次序: 高 低 !算术运算符关系运算符& |赋值运算符!a&b|xy&c (!a&b)|(xy)&c) (ab)&(xy) 可写成:ab&xy(a=b|(x=y) 可写成:a=b|xy !a |ab 可写成: !a|ab54.2.2逻辑表达式逻辑表达式 如前所述,逻辑表达式的值应该是一个逻辑量如前所述,逻辑表达式的值应该是一个逻辑量“真或真或“假。假。C言语
8、编译系统言语编译系统在给出逻辑运算结果时,以数值在给出逻辑运算结果时,以数值1代表代表“真,以真,以0代表代表“假,但在判别一个量能假,但在判别一个量能否为否为“真时,以真时,以0代表代表“假,以非假,以非0代表代表“真。即将一个非零的数值认作为真。即将一个非零的数值认作为“真真。例如:。例如: 假设假设a4,那么!,那么!a的值为的值为0。由于。由于a的值为非的值为非0,被认作,被认作“真,对它进展真,对它进展“非非运算,得运算,得“假,假,“假以假以0代表。代表。 假设假设a=4,b=5,那么,那么a&b的值为的值为1。由于。由于a和和b均为非均为非0,被以为是,被以为是“真,因真
9、,因此此a&b的值也为的值也为“真,值为真,值为1。 a、b值同前,值同前,a|b的值为的值为1。 a、b值同前,!值同前,!a|b的值为的值为1。 4&0|2的值为的值为1。 经过这几个例子可以看出,由系统给出的逻辑运算结果不是经过这几个例子可以看出,由系统给出的逻辑运算结果不是0就是就是1,不可以,不可以是其它数值。而在逻辑表达式中作为参与逻辑运算的运算对象操作数可以是是其它数值。而在逻辑表达式中作为参与逻辑运算的运算对象操作数可以是0“假或任何非假或任何非0的数值按的数值按“真对待。假设在一个表达式中不同位置上真对待。假设在一个表达式中不同位置上出现数值,应区分哪些是作为
10、数值运算或关系运算的对象,哪些作为逻辑运算的出现数值,应区分哪些是作为数值运算或关系运算的对象,哪些作为逻辑运算的对象,对象,6例如 53&2|84-!0表达式自左至右扫描求解。首先处置“53由于关系运算符优先于&。在关系运算符两侧的5和3作为数值参与关系运算,53的值为:1。再进展1&2的运算,此时1和2均是逻辑运算对象,均作“真处置,因此结果为1。再往下进展“1|84-!0的运算。根据优先次序,先进展“!0运算得1,因此,要运算的表达式变成:“1|84-1,即“1|8d不被执行,因此n的值不是0而仍坚持原值1。这点请读者留意。 熟练掌握C言语的关系运算符和逻辑运算符
11、后,可以巧妙地用一个逻辑表达式来表示 一个复杂的条件。 例如,判别某一年year能否闰年。闰年的条件是符合下面二者之一:能被4整除,但 不能被100整除。能被4整除,又能彼400整除。 可以用一个逻辑表达式来表示: year40&(year100 !=0|year400=0) 当year为某一整数值时,上述表达式值为真1,那么year为闰年;否那么为非闰年。 可以加一个“!用来判别非闰年: !( year40&year100 !=0|year400=0) 假设表达式值为真1, year为非闰年。也可以用下面逻辑表达式判别非闰年:year4!=0|year100=0|year40
12、0!=0 表达式为真,year为非闰年。请留意表达式中右面的括弧内的不同运算符,!,&、=的运算优先次序。843 if语句语句 if语句是用来断定所给定的条件能否满足,根据断定的结果真或假决议执语句是用来断定所给定的条件能否满足,根据断定的结果真或假决议执行给出的两种操作之一。行给出的两种操作之一。4.3.1 if语句的三种方式语句的三种方式 C言语提供了三种方式的言语提供了三种方式的if语句:语句: 1if 表达式表达式 语句语句 例如:例如:ifxy printfd,x; 这种这种if语句的执行过程见图语句的执行过程见图0表达式语句192if表达式 语句1 else 语句2 例如:
13、if(xy) printfd,x; else printfd,y; 见图表表达达式式语句语句1语句语句2真假103 if 表达式1 语句1 else if 表达式2 语句2 else if表达式3 语句3 else if 表达式m 语句m else 语句n 流程图表达表达式式1FT表达表达式式3FT表达表达式式2FT表达表达式式4FT语句语句4语句语句5语句语句3语句语句2语句语句111 例如。 if number500 cost015; else ifnumber300 cost=010: else if number100 cost=0075; else if number50 cost0
14、.05; else cost0; 阐明:三种方式的if语句中在if后面都有“表达式,普通为逻辑表达式或关系表达式。例如,ifa=b&.x=y printfa=b,x=y;系统对表达式的值进展判别,假设为0,按“假处置,假设为非0,按“真处置,执行指定的语句。假设有以下语句:if3 printf(“ok.;是合法的,执行结果输出ok。由于表达式的值为3,按“真处置。由此可见,表达式的类型不限于逻辑表达式,可以是恣意的数值类型包括整型、实型、字符型、指针型数据。例如,下面的语句也是合法的: ifa printfd,a;执行结果:输出a的AscII码97。12 2第二、第三种方式的讨语句中,
15、在每个else前面有一分号,整个语句终了处有一分号。例如: if x0 printf(“%f,x); else printf(“%f,-x); 这是由于分号是C语句中不可短少的部分,这个分号是让语句中的内卧语句所要求的。假设无此分号,那么出现语法错误。但应留意,不要误以为上面是两个语句if语句和else语句。 它们都属于同一个if语句。else子句不能作为语句单独运用,它必需是if语句的一部分,与if配对运用。 3在if和else后面可以只含一个内嵌的操作语句如上例,也可以有多个操作语句,此时用花括号“ 将几个语句括起来成为一个复合语句。如: if abc&bca&cab s=
16、05*(ab+c);area=sqrts*(s-a)*(s-b)*(s-c); printfarea6.2f,area; else printf it is not a trilateral; 留意在 外面不需求再加分号。由于 内是一个完好的复合语句,不需另附加分号。13 例4。1输入两个实数,按代数值由小到大次序输出这两个数。 /* example 4.1 at page 53 */main()float a,b,t;scanf(%f,%f,&a,&b);if(ab) t=a;a=b;b=t;printf(%5.2f,%5.2f,a,b); 运转情况如下。 3.6,-3.2一
17、32036014例42输入三个数,按大小顺序输出。main()float a,b,c,t; printf(Input a,b,cn);scanf(%f,%f,%f,&a,&b,&c);if(ab) t=a;a=b;b=t;if(ac) t=a;a=c;c=t;if(bc) t=b;b=c;c=t;printf(%5.2f,%5.2f,%5.2f,a,b,c); 运转情况如下: 3,7,1 1O0,300,700154.3.2语句的嵌套语句的嵌套 在在if语句中又包含一个或多个语句中又包含一个或多个if语句称为语句称为if语句的嵌套。普通方式如下:语句的嵌套。普通方式如下
18、: if () if语句语句1 else 语句语句2 else if (语句语句3 else 语句语句4 该当留意该当留意if与与else的配对关系。从最内层开场,的配对关系。从最内层开场,else总是与它上面最近的未曾总是与它上面最近的未曾配对的配对的if配对。假设写成:配对。假设写成: 1f if语句语句1 else if 语句语句2 else 语句语句3编程序者把编程序者把else写在与第一个写在与第一个if外层外层if同一列上,希望同一列上,希望else与第一个与第一个if对应,但对应,但实践上实践上else是与第二个是与第二个if配对,由于它们相距最近。因此最好使内嵌配对,由于它们相
19、距最近。因此最好使内嵌if语句也包含语句也包含else部分,这样部分,这样if的数目和的数目和else的数目一样,从内层到外层一一对应,不致出措。的数目一样,从内层到外层一一对应,不致出措。16假设if与else的数目不一样,为实现程序设计者的企图,可以加花括弧来确定配对关系。例如: if( if 语句1 else 语句2这时if限定了内嵌if语句的范围,因此else与第一个让配对。 例43有一函数: -1 (x0)编一程序,输入一个x值,输出y值。 有以下几种写法,请读者判别哪些是正确的?17程序1: main int x,y; scanfd,x; if(x=0 if(x0) y=1; el
20、se y=0; else y一1; 18程序3: 将上述if语句改为: y一1; if(x!=0) ifx0 y1: else y0; 程序4: y0; if(x=0) ifx0 y1; else y-1; 只需程序1和2是正确的。普通把内嵌的if语句放在外层的else子句中如程序1那样,这样由于有外层的else相隔,内嵌的else不会和外层的if配对,而只能与内嵌的让配对,从而不致搞混,如像程序3、4那样就容易混淆。194.3.3条件运算符条件运算符 假设假设if语句中,在表达式为语句中,在表达式为“真和真和“假时,且都只执行一个赋值语句给同一假时,且都只执行一个赋值语句给同一个变量赋值时,
21、可以用简单的条件运算符来处置。例如,假设有以下个变量赋值时,可以用简单的条件运算符来处置。例如,假设有以下if语句:语句: if ab max=a; else maxb;可以用下面的条件运算符可以用下面的条件运算符(? :)来处置:来处置: maxab?a:b;其中其中ab?a:b是一个是一个“条件表达式。它是这样执行的。假设条件表达式。它是这样执行的。假设ab条件为真,那么条件表式取值条件为真,那么条件表式取值a,否那么取值否那么取值b. 条件运算符要求有三个操作对象条件运算符要求有三个操作对象,称三目称三目(元元)运算符。条件表达式的普通方式为运算符。条件表达式的普通方式为 表达式表达式1
22、?表达式?表达式2:表达式:表达式3 它的执行过程见图它的执行过程见图47。表 达式1表达式2表达式3T (1)F(0)20阐明 1条件运算符的执行顺序:先求解表达式1,假设为非0真那么求解表达式2,此时表达式2的值就作为整个条件表达式的值。假设表达式1的值为0(假,那么求解表达式3,表达式3的值就是整个条件表达式的值。 maxab?a:b执行结果就是将条件表达式的值赋给max,也就是将a和b二者中大者赋给max。 2条件运算符优先于赋值运算符,因此上面赋值表达式的求解过程是先求解条件表达式,再将它的值赋给max。 条件运算符的优先级别比关系运算符和算术运算符都低。因此, max=ab?a:b
23、括号可以不要,可写成 max=ab?a:b假设有 ab?a:b+1相当于ab?a:b十1,而不相当于ab?a:b1。213。条件运算符的结合方向为“自右至左。假设有以下条件表达式: ab?a:cd?c:d相当于 ab?a:cd?c:da=1,b=2,c=3,d4,那么条件表达式的值等于4。 4条件表达式不能取代普通的if语句,只需在if语句中内嵌的语句为赋值语句且两个分支都给同一个变量赋值时才干替代if语句。象下面的if语句就无法用一个条件表达式替代。 ifab printf“d,a; else printf“d,b;但可以用下面语句替代: printfd,ab?a:b;即将条件表达式的值输出
24、。 5条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同。如 x?a:bx是整型变量,假设x=0,那么条件表达式的值为b。表达式2和表达式3的类型也可以不同,此时条件表达式的值的类型为二者中较高的类型。如 xy?1:1.5如xy值应为1,由于15是实型,比整型高见第二章27,因此,将1转换成实型值10。22例44输入一个字符,判别它能否大写字母,假设是,将它转换成小写字母;假设不是,不转换。然后输出最后得到的字符。 /* example 4.4 at page 57 */main()char ch;scanf(%c,&ch);ch=(ch=A & ch=Z)?(ch
25、+32):ch;printf(%c,ch); 运转结果如下: 条件表达式中的ch32,其中32是小写字母和大写字母ASCII码的差值请参阅附录1。2344 switch语句语句 switch语句是多分支选择语句。语句是多分支选择语句。if语句只需两个分支可供选择,而实践问题中语句只需两个分支可供选择,而实践问题中经常需求用到多分支的选择。例如,学生成果分类经常需求用到多分支的选择。例如,学生成果分类90分以为分以为A等,等,8089分分为为B等,等,7079分为分为c,等,等,;人口统计分类按年龄分为老、中、青、;人口统计分类按年龄分为老、中、青、少、儿童;工资统计分类;银行存款分类;少、儿童
26、;工资统计分类;银行存款分类;等。当然这些都可以用嵌套的等。当然这些都可以用嵌套的让语句来处置,但假设分支较多,那么嵌套的让语句来处置,但假设分支较多,那么嵌套的if语句层数多,程序冗长而且可读语句层数多,程序冗长而且可读性降低。性降低。C言语提供言语提供switch语句直接处置多分支选择,它相当于语句直接处置多分支选择,它相当于Pascal言语中的言语中的case语句。它的普通方式如下:语句。它的普通方式如下: switch 表达式表达式 case常量表达式常量表达式1:语句:语句1 case常量表达式常量表达式2:语句:语句2 case常量表达式常量表达式n:语句:语句n default
27、:语句:语句n十十1 24例如,根据考试成果的等级打印出百分制分数段: switch grade caseA: printf “85100n; caseB: printf“7084n; caseC: printf “6069n; case D: printf“60n; default : printf errorn; 25 阐明: 1switch后面括弧内的“表达式,可以是整型表达式或字符型表达式,也可以是枚举型数据见第十章。对其它类型,原来的C规范是不允许的,而新的ANSI规范允许上述表达式和case常量表达式为任何类型。 2当表达式的值与某一个case后面的常量表达式的值相等时,就执行此c
28、ase后面的语句,假设一切的case中的常量表达式的值都没有与表达式的值匹配的,就执行defau1t后面的语句。3。每一个case的常量表达式的值必需互不一样,否那么就会出现相互矛盾的景象对表达式的同一个值,有两种或多种执行方案。 4各个case的出现次序不影响执行结果。例如,可以先出现caseD:,然后是caseA: 5。执行完一个case后面的语句后,流程控制转移到下一个case继续执行。“case常量表达式只是起语句标号作用,并不是在该处进展条件判别。在执行switch语句时,根据switch后面表达式的值找到匹配的人口标号,就从此标号开场执行下去,不再进展判别。26例如,上面的例子中,假设grade的值等于A,那么将延续输出: 85100 7084 6069 60 error因此,应该在执行一个case分支后,使流程跳出switch构造,即终止switch语句的执行,可以用了个break语句来到达此目的,将上面的switch构造改写如下: switch grade caseA:printf“85100n; break; caseB:printf“7084n; break; caseC:printf“
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 化工厂充装人员课件培训
- 《汽车文化》课件 第二章 汽车基本结构 第一节 汽车的分类
- 福建省泉州市第五中学2025-2026学年上学期期末七年级数学试卷(无答案)
- 2026年陕西省西安市碑林区西北工大附中中考数学第一次适应性试卷(含简略答案)
- 2026年度牛市下半场实物再通胀
- 钢结构焊接材料选用技术要点
- 2026年上半年黑龙江事业单位联考省人民政府黑瞎子岛建设和管理委员会招聘4人备考考试题库及答案解析
- 2026内蒙古鄂尔多斯市城投商业运营管理有限公司招聘46人参考考试题库及答案解析
- 市场调研公司数据管理制度
- 2026湖南株洲市天元中学招聘编外合同制教师考试备考试题及答案解析
- 电站火灾事故应急预案
- GJB827B--2020军事设施建设费用定额
- 娃娃菜栽培技术
- 工业锅炉司炉课件
- 数字营销专业人才培养方案
- 新疆概算管理办法
- 女性中医健康养生讲座
- 《养老服务政策法规与标准》智慧健康养老服务专业全套教学课件
- 知识付费商业模式设计
- 无锡车联天下信息技术有限公司智能网联汽车车载显示模组研发及智能化生产项目环评资料环境影响
- 抹灰层阴阳角方正度控制技术
评论
0/150
提交评论