第四章 逻辑运算和判断选取控制_第1页
第四章 逻辑运算和判断选取控制_第2页
第四章 逻辑运算和判断选取控制_第3页
第四章 逻辑运算和判断选取控制_第4页
第四章 逻辑运算和判断选取控制_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第四章 逻辑运算和判断选取控制41 关系运算符和关系表达式关系运算是逻辑运算中比较简单的一种。所谓“关系运算”实际上是“比较运算”。将两个值进行比较,判断比较的结果是否符合给定的条件。例如,a3是一个关系表达式,大于号()是一个关系运算符,如果a的值为5,则满足给定的“a3”条件,因此关系表达式的值为“真”(即“条件满足”);如果a的值为2,不满足“a3”条件,则称关系表达式的值为“假”。4.1.1 关系运算符及其优先次序 c语言提供6种关系运算符: (1) (小于) (2) (大于) (4) = (大于或等于) (5) = = (等于) (6) != (不等于)关于优先次序:1前4种关系运算

2、符(,)的优先级别相同,后两种也相同。前4种高于后2种。例如,“”优先于“=”。而“”与“”优先级相同。 2关系运算符的优先级低于算术运算符。 3. 关系运算符的优先级高于赋值运算符。 高 低 算术运算符 关系运算符 赋值运算符例如:ca+b 等效于 c(a+b) ab!=c 等效于 (ab)!=c a=bc 等效于 a=(bb, abbc,(a3)(b=5),ab,(ab)(bc)关系表达式的值是一个逻辑值,即“真”或“假”。例如,关系表达式“53”的值为“假”“5=0”的值为“真”。c语言没有逻辑型数据(pascal语言以true表示“真”,以fa1se表示“假”。pascal和fortr

3、an等语言都有逻辑型变量和逻辑型常量),以1代表“真”,以“0”代表“假”。例如,若a=3,b=2,c=1,则: ab的值为”真”,表达式的值为1。(ab)=c的值为“真”(因为ab的值为1,等于c的值),表达式的值为1。 bca的值为“假”,表达式的值为0。 如果有以下赋值表达式: dab d的值为1。 fabc f的值为0(因为“”运算符是自左至右的结合方向,先执行“ab”,得值为1,再执行关系运算:“1c”得值0,赋给f 42逻辑运算符和逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来就是逻辑表达式。下面介绍c语言中的逻辑运算符和逻辑运算。4.2.1逻辑运算符及其优先次序 c语言提供三

4、种逻辑运算符: 1& 逻辑与(相当于其它语言中的and) 2| 逻辑或(相当于其它语言中的or) 3 ! 逻辑非(相当于其它语言中的not) &和|”是“双目(元)运算符”,它要求有两个运算量(操作数),如(ab)&(xy),(ab)|(xy)。“!”是“一目(元)运算符”,只要求有一个运算量,如!(ab)。 逻辑运算举例如下: a&b 若a,b为真,则a&b为真。 a|b 若a,b之一为真,则a|b为真。 !a 若a为真,则!a为假。 下表为逻辑运算的“真值表”。用它表示当a和b的值为不同组合时,各种逻辑运算所得到的值。 a b !a !b a&b a|b t t f f t t t f f

5、 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|ab4.2.2逻辑表达式 如前所述,逻辑表达式的值应该是一个逻辑量“真”或“假”。c语言编译系统在给出逻辑运算结果时,以数值1代表“真”,以0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。即将一个非零的数值认作为“真”。例如: 若a4,则!a的值为0。因为

6、a的值为非0,被认作“真”,对它进行“非”运算,得“假”,“假”以0代表。 若a=4,b=5,则a&b的值为1。因为a和b均为非0,被认为是“真”,因此a&b的值也为“真”,值为1。 a、b值同前,a|b的值为1。 a、b值同前,!a|b的值为1。 4&0|2的值为1。 通过这几个例子可以看出,由系统给出的逻辑运算结果不是0就是1,不可能是其它数值。而在逻辑表达式中作为参加逻辑运算的运算对象(操作数)可以是0(“假”)或任何非0的数值(按“真”对待)。如果在一个表达式中不同位置上出现数值,应区分哪些是作为数值运算或关系运算的对象,哪些作为逻辑运算的对象,例如 53&2|84-!0表达式自左至右

7、扫描求解。首先处理“53”(因为关系运算符优先于&)。在关系运算符两侧的5和3作为数值参加关系运算,”53”的值为:1。再进行”1&2”的运算,此时1和2均是逻辑运算对象,均作“真”处理,因此结果为1。再往下进行“1|84-!0”的运算。根据优先次序,先进行“!0”运算得1,因此,要运算的表达式变成:“1|84-1”,即“1|8d不被执行,因此n的值不是0而仍保持原值1。这点请读者注意。 熟练掌握c语言的关系运算符和逻辑运算符后,可以巧妙地用一个逻辑表达式来表示 一个复杂的条件。 例如,判别某一年year是否闰年。闰年的条件是符合下面二者之一:能被4整除,但 不能被100整除。能被4整除,又能

8、彼400整除。 可以用一个逻辑表达式来表示: year40&year100 !=0|year400=0 当year为某一整数值时,上述表达式值为真(1),则year为闰年;否则为非闰年。 可以加一个“!”用来判别非闰年: !( year40&year100 !=0|year400=0) 若表达式值为真(1), year为非闰年。也可以用下面逻辑表达式判别非闰年:(year4!=0)|(year100=0|year400!=0) 表达式为真,year为非闰年。请注意表达式中右面的括弧内的不同运算符(,!,&、=)的运算优先次序。43 if语句 if语句是用来判定所给定的条件是否满足,根据判定的结

9、果(真或假)决定执行给出的两种操作之一。4.3.1 if语句的三种形式 c语言提供了三种形式的if语句: 1if (表达式) 语句 例如:if(xy) printf(”d”,x); 这种if语句的执行过程见图2if(表达式) 语句1 else 语句2 例如:if(xy) printf(”d”,x); else printf(”d”,y); 见图3 if (表达式1) 语句1 else if (表达式2) 语句2 else if(表达式3) 语句3 else if (表达式m) 语句m else 语句n 流程图 例如。 if (number500) cost015; else if(number

10、300) cost=010: else if (number100) cost=0075; else if (number50) cost0.05; else cost0; 说明:三种形式的if语句中在if后面都有“表达式”,一般为逻辑表达式或关系表达式。例如,if(a=b&.x=y) printf(”a=b,x=y”);系统对表达式的值进行判断,若为0,按“假”处理,若为非0,按“真”处理,执行指定的语句。假如有以下语句:if(3) printf(“ok.”);是合法的,执行结果输出”ok”。因为表达式的值为3,按“真”处理。由此可见,表达式的类型不限于逻辑表达式,可以是任意的数值类型(包括

11、整型、实型、字符型、指针型数据)。例如,下面的语句也是合法的: if(a) printf(”d”,a);执行结果:输出a的ascii码97。 2第二、第三种形式的讨语句中,在每个else前面有一分号,整个语句结束处有一分号。例如: if (x0) printf(“%f”,x); else printf(“%f”,-x); 这是由于分号是c语句中不可缺少的部分,这个分号是让语句中的内卧语句所要求的。如果无此分号,则出现语法错误。但应注意,不要误认为上面是两个语句(if语句和else语句)。 它们都属于同一个if语句。else子句不能作为语句单独使用,它必须是if语句的一部分,与if配对使用。 3

12、在if和else后面可以只含一个内嵌的操作语句(如上例),也可以有多个操作语句,此时用花括号“ ”将几个语句括起来成为一个复合语句。如: if (abc&bca&cab) s=05*(ab+c);area=sqrt(s*(s-a)*(s-b)*(s-c)); printf(”area6.2f”,area); else printf (”it is not a trilateral”); 注意在 外面不需要再加分号。因为 内是一个完整的复合语句,不需另附加分号。 例4。1输入两个实数,按代数值由小到大次序输出这两个数。 /* example 4.1 at page 53 */main()floa

13、t 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一320360例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,7004.3.2语

14、句的嵌套 在if语句中又包含一个或多个if语句称为if语句的嵌套。一般形式如下: 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配对,因为它们相距最近。因此最好使内嵌if语句也包含else部分,这样if的数目和else的数目相同,从内层到外层一一对应,不致

15、出措。如果if与else的数目不一样,为实现程序设计者的企图,可以加花括弧来确定配对关系。例如: if( ) if ( )语句1 else 语句2这时if限定了内嵌if语句的范围,因此else与第一个让配对。 例43有一函数: -1 (x0)编一程序,输入一个x值,输出y值。 有以下几种写法,请读者判断哪些是正确的?程序1: main () int x,y; scanf(”d”,x); if(x=0) if(x0) y=1; else y=0; else y一1; 程序3: 将上述if语句改为: y一1; if(x!=0) if(x0) y1: else y0; 程序4: y0; if(x=0

16、) if(x0) y1; else y-1; 只有程序1和2是正确的。一般把内嵌的if语句放在外层的else子句中(如程序1那样),这样由于有外层的else相隔,内嵌的else不会和外层的if配对,而只能与内嵌的让配对,从而不致搞混,如像程序3、4那样就容易混淆。4.3.3条件运算符 若if语句中,在表达式为“真”和“假”时,且都只执行一个赋值语句给同一个变量赋值时,可以用简单的条件运算符来处理。例如,若有以下if语句: if (ab) max=a; else maxb;可以用下面的条件运算符(? :)来处理: max(ab)?a:b;其中”(ab)?a:b”是一个“条件表达式”。它是这样执行

17、的。如果(ab)条件为真,则条件表式取值a,否则取值b. 条件运算符要求有三个操作对象,称三目(元)运算符。条件表达式的一般形式为 表达式1?表达式2:表达式3 它的执行过程见图47。说明 1条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。 max(ab)?a:b执行结果就是将条件表达式的值赋给max,也就是将a和b二者中大者赋给max。 2条件运算符优先于赋值运算符,因此上面赋值表达式的求解过程是先求解条件表达式,再将它的值赋给max。 条件运算符的优先

18、级别比关系运算符和算术运算符都低。因此, max=(ab)?a:b括号可以不要,可写成 max=ab?a:b如果有 ab?a:b+1相当于ab?a:(b十1),而不相当于(ab?a:b)1。3。条件运算符的结合方向为“自右至左”。如果有以下条件表达式: ab?a:cd?c:d相当于 ab?a:(cd?c:d)a=1,b=2,c=3,d4,则条件表达式的值等于4。 4条件表达式不能取代一般的if语句,只有在if语句中内嵌的语句为赋值语句(且两个分支都给同一个变量赋值)时才能代替if语句。象下面的if语句就无法用一个条件表达式代替。 if(ab) printf(“d”,a); else print

19、f(“d”,b);但可以用下面语句代替: printf(”d”,ab?a:b);即将条件表达式的值输出。 5条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同。如 x?a:bx是整型变量,若x=0,则条件表达式的值为b。表达式2和表达式3的类型也可以不同,此时条件表达式的值的类型为二者中较高的类型。如 xy?1:1.5如xy值应为1,由于15是实型,比整型高(见第二章27),因此,将1转换成实型值10。例44输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。 /* example 4.4 at page 57 */main()char ch;scanf(%c,&ch);ch=(ch=a & ch0,有两个不等实根。 b2一4ac0,有两个共轭复根。 画出ns流程图表示算法(图410 page 62)。 程序如下:/* example 4.6 at page 61 */#include math.hmain() float a,b,c,disc,x1,x2,realpart,imagpart,zero=1e-6;printf(input a,b,cn);scanf(%f,%f,%

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论