C06第4章逻辑运算与选择结构程序.ppt_第1页
C06第4章逻辑运算与选择结构程序.ppt_第2页
C06第4章逻辑运算与选择结构程序.ppt_第3页
C06第4章逻辑运算与选择结构程序.ppt_第4页
C06第4章逻辑运算与选择结构程序.ppt_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

新编C语言程序设计教程 清华大学出版社,周二强 软件学院 计算机科学与工程系 配套视频: 博客:/stunt,第4章逻辑运算和选择结构程序,“用户输入的数是否为三位的正整数?” “变量a是否为正数?” 这类问题的答案只有两个:“是”或者“否”。 先假设一个“结论”,如“变量a是正数”或者“变量a不是正数”,然后根据事实对结论进行判断从而得到一个或为真或为假的值。 对结论进行判断,并得出一个或为真或为假的值的过程也是一种运算即逻辑运算。,第4章逻辑运算和选择结构程序,4.1 关系操作符和关系表达式 4.2 逻辑操作符和逻辑表达式 4.2.1 逻辑操作符 4.2.2 逻辑表达式求值 4.3 简单的if结构 4.3.1 if结构的作用 4.3.2 if结构的语法 4.4 if-else结构 4.4.1 if-else结构的形式与用法,“真”和“假”的编码,C语言中用“0”表示“假”,不为“0”的所有值都被认为是“真”。 被认为是“假”的“0”可能是整数0,浮点数0也可能是ASCII码为0的字符。 C语言中表示逻辑值的变量可以是任意的基本数据类型 。int i=3; float f=0.0; char ca=a,cb=0; C语言中非0为“真”,但是“真”被认为是1。a = (3 2)时 a的值为1。 语句printf(“%d,%dn“, a = (3 2), 3 2);,4.1关系操作符和关系表达式,C语言提供了6种关系操作符:(大于)、 = (大于等于)、 = = (等于)、!=(不等于)。 关系操作符进行的运算是“比较运算”,根据比较情况得出真或假的结果,是一种简单的逻辑运算。,4.1关系操作符和关系表达式,用关系操作符将两个表达式连接而成的式子就是关系表达式。a (b + c)、(a = = b) (c + d)等都是合法的关系表达式。6种关系操作符中前4种的优先级相同,后2种也相同,并且前4种高于后2种。 关系操作符的优先级低于算术运算符(先求值再关系运算)高于赋值操作符(赋值操作符的优先级仅比逗号操作符的优先级高)。,例4.1 关系表达式求值,(1)A Z (2) 3 -5u 0 字符型数据在比较大小时通常被看作整型,字符型数据的大小由其ASCII码的值决定。 3 -5u中-5u为无符号数,故3 -5u的类型也为无符号数。3 -5u不可能等于0,因此大于0,即3 -5u 0的值为1即真。 -5u即-5先用补码表示再被看做无符号数,两个正数相加的结果当然不会小于0)。 能用printf函数输出值的方式判断结果是否大于0吗?printf(“?”,3-5u);,例4.1 关系表达式求值,(3) a % 2 != 0 (4) 99 x 1000 x为2523 (3)当a为奇数时,a % 2值为1,表达式a % 2 != 0的值也为1即真,当a为偶数时,a % 2值为0,表达式a % 2 != 0的值也为0即假,显然关系表达式a % 2 != 0用于判断变量a是否为奇数。 (4) 操作符是左结合,故表达式99 x 1000等价于(99 x) 1000, x为2523时,子表达式99 x为真即值为1,原表达式变为1 1000,它的值为1即真,因此99 x 1000的值为1即真。,return,4.2.1 逻辑操作符,对于代数式99 99) & (x 1000)与代数式99 x 1000等价。 逻辑运算符的操作数是逻辑量,而逻辑量只有真和假两个值,因此常用穷举法来说明逻辑操作符的运算规则,即所谓的真值表。,表4-1为逻辑与&的真值表,代数式99 99) & (x 99为真且x 99) & (x 1000)的值为真为1。,表4-1为逻辑与&的真值表,当代数式99 99和x 99) & (x 1000)的值也为假为0。 反之亦然!,逻辑表达式3 & 4,逻辑或操作符|,逻辑或操作符|表示“或者”的关系。 a和b只要有一个为真时a | b的值就为真为1,只有a和b同时为假时,a | b的值才为假为0。,例4-2 用C表达式表示结论“变量a的绝对值大于5”。,分析:当|a| 5时有a 5或者a 5) | (a 5表示。 C语言中还有一个称为逻辑非!的逻辑操作符。逻辑非!是一个单目操作符。当a为真(非0)时,!a的值为假(0);当a为假(0)时,!a的值为真(1)。 如与“变量a的绝对值不大于5”相应的表达式可以写成 !(a5)| (a = -5)。,逻辑操作符的优先级,逻辑与&和逻辑非|的优先级低于关系操作符即先求(逻辑)值再(逻辑)运算,而逻辑与&的优先级又高于逻辑或|的优先级。单目操作符的优先级都比较高,逻辑非!的优先级不仅高于关系操作符,而且还高于算术运算符。 本节相关的逻辑表达式也可写作:x 99 & x 5 | x 5 | a = -5。,切记值的双重含义,切记C语言中一个值既是逻辑量又是普通的数值,在进行逻辑运算时要把操作数看作逻辑量;在进行算术运算时要把操作数理解为普通的数值。 如表达式!a * 2.3求值时, 先计算子表达式!a的值,a非0为真则!a的值为假为0,原表达式变为0 * 2.3,值为0.0也即假。,例4-3用逻辑表达式表示下面的结论,整型变量n是2、3的公倍数或者是7的倍数 整型变量x、y、z中x、y至少有一个小于z 整型变量x、y、z中x、y只有一个小于z 长度为a、b、c的三边可以构成一个三角形,分析:,(1)n是2、3的公倍数即n是2的倍数,且还是3的倍数,可表示为(a % 2 = 0 & n % 3 = 0)。n或者又是7的倍数,则整个表达式为(a % 2 = 0 & n % 3 = 0) | n % 7 = 0。表达式中的括号仅为了提高可读性,由逻辑操作符的优先级可知该逻辑表达式可直接写作a % 2 = 0 & n % 3 = 0 | n % 7 = 0。(等价于n % 6 = 0 | n % 7 = 0) (2)x、y中至少有一个小于z 也就是x小于z或者y小于z,相应的逻辑表达式为x z | y z。,分析:,(3) x、y中只有一个小于z,也就是只有x小于z或者只有y小于z,当只有x小于z时有x小于z且y不小于z,相应的逻辑表达式为(x = z) | ( = )。 (4)构成三角形的三边应满足任意两边之和大于第三边的条件,这里的“任意”显然是“并且”的关系。相应的逻辑表达式为 + & + & + 。,return,4.2.2逻辑表达式求值,逻辑运算时需把操作数看成或为真或为假的逻辑量,逻辑运算的结果是或用1或用0表示的逻辑值。逻辑表达式求值的难点在于逻辑与&和逻辑或|的“短路计算”及序列点。,例4-4 分析程序的运行情况,分析:,分析:a b & (a = 1) & (a = 2)等同于(a b) & (a = 1) & (a = 2), a b的值为0,故(a b) & (a = 1)的值为0。由于短路计算子表达式a = 1不会被求值(执行)(如果执行的话,a被赋值为1且表达式a = 1的值为1即真)。原表达式变为0 & (a = 2),故原表达式的值为0即假,且赋值表达式a = 2也没有执行。此表达式求值时并没有改变变量a的值。,序列点,逻辑与&和逻辑或|操作符处有一个序列点。 序列点的概念比较复杂,这里只简单介绍其作用。含有序列点的表达式求值时应先考虑序列点的影响,要保证序列点左边的子表达式先于其右边的子表达式求值。 如表达式a|b求值时,因|处有一个序列点,则子表达式a肯定先于子表达式b求值。,例4-5 分析程序的运行情况,分析,表达式a | (a = 1) & (a += 2)中逻辑与&的优先级高于逻辑或|的,通常应先计算子表达式(a = 1) & (a = 2)的值,但是,逻辑或|处有序列点,表达式求值时应先考虑序列点再考虑优先级。序列点的存在使得子表达式a应先于后面的子表达式求值,因此原表达式等价于(a) | (a = 1) & (a += 2)。表达式a的值显然为真,又由于C语言中的逻辑或|操作符是“短路计算”。因此子表达式(a = 1) & (a += 2)不会被求值,变量a的值也不会被修改!,分析:,表达式(a = 0) & (a = 5) | (a += 1)中逻辑与&处也有一个序列点,因此子表达式a = 0先于后面的子表达式求值,再由操作符的优先级可知,原表达式等价于(a = 0) & (a = 5) | (a += 1)。由于a = 0的值为0,故子表达式(a = 0) & (a = 5)的值也为0即假,且子表达式a = 5不会被求值。原表达式变为0 | (a += 1),此时显然要继续对a += 1求值,求值后变量a的值变为1,结果也为1即真,故原表达式的值为1即真。,注意:,使用赋值表达式“客串”逻辑量只是为了直观地分析逻辑表达式的求值过程,实际的程序中不应该也不必出现类似的表达式。 此外,在应该出现逻辑量的地方,关系表达式a % 2 != 0显然要比等价的算术表达式a % 2有更好的可读性。 由于关系表达式的值为逻辑量1(真)或0(假),因此有时也称关系表达式为逻辑表达式。,return,4.3.1 if结构的作用,编程时常需根据一定的条件有选择的执行一些C语句。 如编写求绝对值的程序时,要考虑用户的输入(f)是否为负数(f0),若为负数(真),则绝对值为输入数的相反数(f = -f)。程序执行时语句f = -f;是否执行显然与表达式f 0的值相关。 C语言中用if结构来处理这种情况。,if结构的形式,if(表达式) 语句 其中,if为C语言关键字,括号中的表达式通常为逻辑表达式,即使此处出现了其它类型的表达式,表达式的值也会被认为是逻辑量(即0为假,非0为真);语句为任意的单条C语言语句;if结构一般分两行书写,第二行语句还要缩进。 if结构执行时,先对表达式求值,若值为真(非0)则执行if结构中的那条C语言语句;若值为假(0),则跳过if结构中的那条C语言语句,继续执行程序中的下一条语句。,例4-6 求绝对值,程序4-6的流程图,选择结构程序,因为程序中包含了选择结构而有了多种可执行路径的程序称为选择结构程序。 只有一种可执行路径的程序称为顺序结构的程序。顺序结构的程序执行时自上而下,依次执行每条语句。“选择结构”提供了多条可执行路径,为程序处理复杂的问题提供了基础。,编程,例4-7 有函数 编程实现该函数(设x的值为整数)。 分析:获得用户输入的x值 若x0,则y的值为x-1; 最后,输出y,例4-7,return,4.3.2 if结构的语法,使用if结构常见的“错误”是在第一行末尾加一个C语言语句的结束标志分号(;)。如: if(x 0); y = x + 1; if结构是一个整体,只有一个分号;,是一条C语言语句。仅有的一个分号;在C语言中也是一条语句,称为空语句,即什么也不做,但它算一条C语句。,例4-8 求整数的绝对值,出错原因,if(i 0); i = -i; if(i 0) ;/*空语句 什么也不做*/ i = -i; 也就是说不管i 0的值是真是假,语句 i = -i;都会被执行。,复合语句,if结构中只能包含一条语句,但是当条件为真时可能需要执行多条语句,在这种情况下可以使用复合语句。 C语言中用一对花括号 把一些语句括起来就构成了复合语句,复合语句被认为是一个整体,是一条语句。 如:if(i 0) i *= i; printf(“%dn”, i); ,例4-9,用户输入一个正整数,如果它不是一个三位的正整数,输出“输入错误,程序退出!”后退出程序;否则输出“输入正确!”。 分析:退出程序可以用return语句。程序执行return语句时会立即终止程序,放弃剩余语句的执行。条件成立时既要输出信息,又要退出程序,显然需用复合语句。,例4-9,return,4.4.1 if-else

温馨提示

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

评论

0/150

提交评论