1、第3章 运算符和表达式,本章的学习重点运算符与表达式的分类算术运算符与算术表达式逻辑运算符与逻辑表达式关系运算符与关系表达式位运算符条件运算符强制类型转换,3.1 运算符与表达式的分类,运算符的分类:可按照操作对象数目分类,例如一元运算符、二元运算符和三元运算符等,也可按照功能分类,例如算术运算符、逻辑运算符、关系运算符等。表达式的分类:主要按照运算符的不同功能进行分类,例如算术表达式、逻辑表达式、关系表达式等。,3.1.1 运算符的分类,按照操作对象的多少,运算符主要可分为一元运算符、二元运算符和三元运算符。例如负号(-)为一元运算符,加号(+)为二元运算符等。除了这些基本运算符之外,C语言
2、还支持复合运算符以及sizeof运算符等。按照功能分类,运算符可分为:算术运算符、赋值运算符、逻辑运算符、关系运算符、条件运算符、位运算符、取字节数运算符等。,3.1.1 运算符的分类,表3-1 运算符分类,3.1.2 表达式的分类,表达式是一种有值的语法结构,它一般由运算符将变量、常量或函数返回值结合而成。 表达式按照运算符的不同进行分类,主要有:算术表达式、逻辑表达式和关系表达式等。 1算术表达式一般由算术运算符和控制运算优先级的括号连接而成 ,例如:3.14159*r, (a+b)/c+d*m. 其中,符号*表示算术运算“乘”,/表示算术运算“除”。 2赋值表达式一般由赋值运算符、算术运
3、算符和操作对象组合而成。一般表达形式为:变量 = 表达式或数值 或者 变量1 = 变量2 = 变量3 = 表达式或数值。,3.1.2 表达式的分类,3逻辑表达式 一般由逻辑运算符和操作对象组合而成, 例如: a & b,c | d & m,!x等。 4关系表达式 一般由关系运算符和操作对象组合而成, 例如:a b, c = d, m = = n等。 5逗号表达式 逗号表达式由其他表达式和逗号运算符组成,例如:a = 12, b = 100, c = a+b 6复合表达式 复合表达式是几种简单表达式的组合,是比较复杂的表达式,例如:num = 12 + b + (c = 35/(d = 7),3
4、.2 运算符的优先级与结合性,当不同的运算符放在一个表达式中进行混合运算时,运算顺序是根据运算符的优先级而定的,优先级高的运算符先运算,优先级低的运算符后运算。 在同一表达式中,如果各运算符有相同的优先级,运算顺序是从左向右,还是从右向左,是由运算符的结合性决定的。所谓结合性是指运算符可以和左边的表达式结合,也可以和右边的表达式结合。,3.2 运算符的优先级与结合性,表3-2 运算符优先级与结合性,3.2 运算符的优先级与结合性,范例3.1 PriorityAndCombine.c 这里使用多运算符的表达式演示不同优先级的运算符组合运算所产生的结果。程序定义变量a,b,c,并使用复合赋值运算符
5、+=验证复合赋值运算符的功能。 分析:查看代码:由于赋值是自右至左的右结合性,因此先计算赋值号右边的表达式a+c*10,结果为210,然后将结果赋给b。,3.3 赋值运算符与赋值表达式,C语言规定,任何变量都要先定义后使用,并且在引用其数值前一定要进行赋值操作,而此时就需要用到赋值运算符“=” 。1简单赋值表达式赋值表达式使用赋值号表示,赋值号左边的对象叫做左值(l-value),赋值号左边只能是变量。 a+=5 等价于 a=a+5若a = 20, 执行后a+=5后,a的值变为25,3.3 赋值运算符与赋值表达式,范例3.2 (LvalueAndRvalue.c) 将int型变量的值赋给sho
6、rt型变量,查看赋值后的结果。为表述方便,程序使用十六进制值0 x12345,接收变量为short型。 2连续赋值表达式 有时需要对几个变量赋予同一个值,这时可以使用连续赋值表达式,例如:int i, j, k;i = j = k = 10;由于赋值运算符是右结合性,因此程序执行顺序为:k = 10j = k i = j,3.3 赋值运算符与赋值表达式,3复合赋值表达式 复合赋值表达式由赋值运算符、算术运算符或逻辑运算符以及操作对象构成。例如,表达式a += 10,它等价于:a = a + 10。 范例3.3 (DAssignmentOperator.c) 使用复合赋值运算符进行算术和赋值操作
7、。程序使用*=和+=分别对变量m和n作赋值运算,验证在同一表达式中两者之间的关系。注意:在工程应用中,应尽量避免使用这些简化的复合赋值运算符,原因有两点:一是编码时容易出错,二是不便于其他程序员阅读。,3.4 算术运算符与算术表达式,C语言除了提供简单的加减乘除四则运算符外,还提供了模除(%)、自增(+)和自减(-)等几种特殊的算术运算符。模除运算符(%)用于求两个整数相除的余数。 自增(+)自减(-)运算符是C语言所特有的运算符,在工程中应用非常频繁。 只能用于单个变量。,3.4.1 算术运算符与数据类型,C语言中,除运算符用/代替,乘运算符用*代替,并且*不能省略(如x*y不能省略为xy)
8、。范例3.4 (ComputeOperatorType.c) 程序使用输出函数printf验证两种不同数据类型进行算术除操作的结果,分析浮点型数据作算术运算的精度。 C语言中,两个整型量作算术运算,其结果仍为整型,例如,算式:1/2的值取商中的整数部分0。 注意:0不能作为除数,否则程序运行时将崩溃。,3.4.1 算术运算符与数据类型,实训3.1计算圆柱体体积 有一长为50cm,宽为30cm的长方形纸张,编写程序,计算将该纸张卷成圆筒时的体积,要求精确到小数点后6位,圆周率取3.141592。纸张卷成圆筒的方法有两种,一种是以长50cm作高,宽30cm作底,另一种是以宽30cm作高,长50cm
9、作底。这里使用第二种方案。 使用周长50cm计算半径r,实现语句:r = 50.0/(2*pi);根据数学公式:V=S*H,计算体积V = pi*r*r*h,其中h=30。采用数据类型double型以满足精度要求。,3.4.2 模除运算符,模除运算符(%):用于求两个整数相除的余数。模除运算只能用于整数间求余运算,不可用于浮点数。并且0不能作为除数。例如:7%3结果为1,而7.5%5将使程序编译出错。C语言规定,%两边都为正整数,结果为正整数或零;%两边都是负整数,结果为负整数数或零。%左边的操作数是正整数,结果为正整数或零;%左边的操作数是负整数,结果为负整数或零,例如:17%4 = 117
10、%-4 = 1-17%4 = -1-17%-4 = -1,3.4.2 模除运算符,范例3.4 (Months2Year.c) 键盘输入总月数,使用%运算符和/运算符将输入的月数换算成年数和月数的形式,如25个月,表示2年零1个月。模除运算,例如m%n,可以使用公式m (m / n) * n代替,例如算式中-17%4,可以使用算式:-17%4 = -17 (-17 / 4) * 4 = -1 注意:和的区别,,3.4.3 自增自减运算符,自增(+)自减(-)运算符:只能用于变量,不能用于表达式或其他C语言对象。下面的操作均错误:(b+c)+;-(m-1); 范例3.5 SelfAddSelfRe
11、duce.c 程序定义4个变量a,b,c,d。对部分变量执行自增自减操作,验证左运算和右运算的区别,并进一步分析自增自减运算符与算术运算符的优先级。范例3.5 SelfAddSelfReduce2.c 定义变量a,分别执行单次和多次自增运算,输出结果,分析同一表达式中两次和三次自增操作中左运算和右运算的差别。,3.5 关系运算符与关系表达式,关系表达式的值:真(1)和假(0)。例如:表达式103的值为1,即为真,而表达式-10的值为0,即为假。 范例3.6 RelationOperater.c 程序分析关系运算符的优先级,验证在同一表达式中有算术运算符和关系运算符时程序执行顺序,分析关系运算符
12、的结合性,分析关系表达式的真和假。 注意:判断两个对象是否相等,使用运算符=或!=,一定与赋值运算符=区分开来。,3.6 逻辑运算符与逻辑表达式,语言中提供了三种逻辑运算符:逻辑与(&)、逻辑或(|)和逻辑非(!)。前两种为双目运算符,具有左结合性。后一种为单目运算符,具有右结合性。 逻辑表达式的值:“真(1)”和“假(0)”两种。逻辑表达式中总是将0作为假,非0作为真。逻辑表达式的一般形式为:操作对象1 逻辑运算符 操作对象2,3.6.1 逻辑与(&),逻辑与运算(&):参与运算的两个操作对象都为真(非0)时,结果为真(1),否则为假(0)。例如,表达式-42 & 3!=5,由于表达式02为
13、假,因此便不再判断表达式3!=5,而直接认为原表达式为假(0)。 范例3.7 LogicAndOperater.c 程序分析逻辑与运算符的优先级与结合性,并分析逻辑与表达式执行过程中对两侧表达式执行顺序的影响。,3.6.2 逻辑或(|),逻辑或运算(|):参与运算的两个操作对象只要有一个为真(非0),结果即为真(1),否则为假(0)。例如,表达式-410 | 3=0,表达式中|优先级低于关系运算符和=,所以表达式等价于(-410)|(3=0),表达式-410为真,因此原表达式的结果为真。 C语言规定,当运算符左边为真(非0)时,即判断表达式为真(1),而不再判断运算符右边是否为真或假。例如,表
14、达式2 | 3!=5,由于常量2为真(非0),因此便不再判断表达式3!=5,而直接认为原表达式为真(1)。 范例3.8 LogicOrOperater.c 程序分别设置逻辑与表达式和逻辑或表达式。在范例3.7基础上进一步分析逻辑与表达式的执行顺序,分析逻辑或的执行顺序,并与逻辑与表达式进行比较。分析产生的结果。,3.6.3 逻辑非(!),逻辑非运算(!):一元运算符,该运算符只能放在操作对象左边。当操作对象为真(非0)时,结果为假(0),操作对象为假(0)时,结果为真。 范例3. LogicNoneOperator.c 程序分析逻辑非表达式的真和假,验证当变量a为非0时,!a的含义,并分析复合
15、逻辑运算时表达式的执行顺序与结果。,实训3.2判断闰年,CalculateLeapYear.c年数中分为平年或闰年,编写程序,判断输入年数是闰年还是平年,闰年输出为1,平年输出为0。 闰年判断公式:(year%4 =0) &(year%100 !=0) | (year%400 =0)。 需求分析:需求1:输入年数需求2:使用逻辑运算符判断输入的年数是否为闰年,3.7 位运算符,位运算:对操作对象中的比特位(bit)进行移位、重置以及逻辑判断等操作。位运算只能用于字符型(char)或整型(int, short, long等),不能用于float、double、void或其他复杂类表-位运算符,3
16、.7 位运算符,1按位与(&) 规则:每个操作对象对应位都为1时,结果才为1,否则为0。例如:3&5的计算方法为:先转化为二进制,然后按位进行与操作。 0000 0011& 0000 0101 - 结果为 0000 0001 应用: 按位与(&)主要用于将某个操作对象的某些位置零,例如,将int型变量的第3、5、7、12位置零,方法为将a和二进制数1110 1111 0101 1111作位与操作,表达式为:a&0 xEF5F。,3.7 位运算符,范例3.10 LogicBitAnd.c使用位&操作取变量a的低10bit位,其余位置零,并使用十六进制打印结果。方法为使变量a与另一常量作&,该常量
17、低10位为1,其余位为0。 2按位或(|) 规则:有一个操作对象对应位为1时,结果即为1,当两个操作对象对应位都为为0时,结果才为。例如:35的计算方法为:先转化为二进制,然后按位进行或操作。0000 00110000 0101-结果为0000 0111,3.7 位运算符,3按位异或() 规则:操作对象对应位相同时为1,不同时为0。例如35的计算方法为:先转化为二进制,然后按位进行异或操作。0000 00110000 0101-结果为0 xF9,十进制数2491111 1001 用途:按位异或()主要用于将操作对象的的某些位翻转(原来为1的位变为0,为0的变为1),其余各位不变。,实训3.3交
18、换两变量的值,ExchangeTwoVariable.c 编写程序,不使用其他中间变量,交换两个整型变量a和b的值。使用按位异或()交换两变量的值。使用异或操作置位两变量对应位不同的位置,并依次交叉操作,达到两值交换的功能,本例主要使用一个变量存储了两个变量信息的特性。需求分析:需求1:交换两个变量的值需求2:不使用中间变量 实现:使用按位异或()运算符,完成操作,方法为:首先将变量a和b作异或操作,将结果赋给a,然后将b与a作异或操作,并将结果赋给b,重复第一步操作,完成。,3.7 位运算符,4按位取反() 按位取反操作是将操作对象各位翻转,即原来为1的位变成0,原来为0的位变成1。例如:1
19、111 1111 0001 0011-0000 0000 1110 1100用途: 按位取反操作主要用于间接地构造一个数,以增强程序的可移植性。,3.7 位运算符,5按位左移() 操作使操作对象的各位右移,高位补0,低位舍弃。与左移类似,操作对象和右移位数只能是整型或字符型。,3.8 条件运算符,条件运算符:C语言中唯一一个三元运算符(三目运算符),其一般表达形式为:(表达式1)?表达式2:表达式3 规则:若表达式1的值为真(非0),则表达式的值为表达式2,否则为表达式3。例如: (ab)?a+b:a-b 当a=10,b=5,c=2时,该表达式的执行过程如下: 首先计算表达式ab是否为真,经运
20、算为真,因此,表达式的值为a+b,即为15。,实训3.4分段函数计算,MulitPartFunction.c 键盘输入变量x的值,使用条件运算符判断函数y的值,并输出x和y的值。编写程序,实现分段函数: 需求分析:需求1:键盘输入变量x的值需求2:使用条件运算符判断变量x的值,并确定y的值思路:判断键盘输入的变量x的值,若x10,则y的值为10。,3.9 sizeof运算符,sizeof运算符:又称为取内存字节运算符,C语言最特殊的运算符之一,用于计算操作对象在内存中所占的字节数。例如: int a=10,b=0; b = sizeof(a); b用于存储变量a在内存中所占字节数,使用size
21、of获取a的内存字节数。 范例3.11 SizeofUseful.c使用sizeof运算符分别获取char short int long float double等几种基本数据类型的内存字节数,获取实型常量1.0以及字符常量a的内存字节数,获取强制类型转换之后的字符常量a的内存字节数。,3.10 强制类型转换,功能:将表达式的运算结果强制转换成类型说明符所表示的类型。其中,类型说明符必须使用括号括起来。例如:(int)m表示把m转换为整型,(double)(a*b+c)表示把表达式a*b+c的值转换为双精度浮点型。注意:第一,类型说明符必须加括号;第二,表达式应该加括号,若表达式仅为单个变量可
22、以不加;第三,强制类型转换不改变被转换对象,仅仅为本次运算所需而进行的操作。,3.10 强制类型转换,范例3.11 CalcVandS.c计算半径r,高h 的圆柱形桶的体积V和表面积S, 取圆周率为3.14,要求计算结果为整型并输出,体积V四舍五入,表面积S仅取整数部分。,9、静夜四无邻,荒居旧业贫。2022-9-12022-9-1Thursday, September 01, 202210、雨中黄叶树,灯下白头人。2022-9-12022-9-12022-9-19/1/2022 4:13:36 PM11、以我独沈久,愧君相见频。2022-9-12022-9-12022-9-1Sep-221-
23、Sep-2212、故人江海别,几度隔山川。2022-9-12022-9-12022-9-1Thursday, September 01, 202213、乍见翻疑梦,相悲各问年。2022-9-12022-9-12022-9-12022-9-19/1/202214、他乡生白发,旧国见青山。2022年9月1日星期四2022-9-12022-9-12022-9-115、比不了得就不比,得不到的就不要。2022年9月2022-9-12022-9-12022-9-19/1/202216、行动出成果,工作出财富。2022-9-12022-9-1September 1, 202217、做前,能够环视四周;做时
24、,你只能或者最好沿着以脚为起点的射线向前。2022-9-12022-9-12022-9-12022-9-19、没有失败,只有暂时停止成功!。2022-9-12022-9-1Thursday, September 01, 202210、很多事情努力了未必有结果,但是不努力却什么改变也没有。2022-9-12022-9-12022-9-19/1/2022 4:13:36 PM11、成功就是日复一日那一点点小小努力的积累。2022-9-12022-9-12022-9-1Sep-221-Sep-2212、世间成事,不求其绝对圆满,留一份不足,可得无限完美。2022-9-12022-9-12022-9-
25、1Thursday, September 01, 202213、不知香积寺,数里入云峰。2022-9-12022-9-12022-9-12022-9-19/1/202214、意志坚强的人能把世界放在手中像泥块一样任意揉捏。2022年9月1日星期四2022-9-12022-9-12022-9-115、楚塞三湘接,荆门九派通。2022年9月2022-9-12022-9-12022-9-19/1/202216、少年十五二十时,步行夺得胡马骑。2022-9-12022-9-1September 1, 202217、空山新雨后,天气晚来秋。2022-9-12022-9-12022-9-12022-9-1
26、9、杨柳散和风,青山澹吾虑。2022-9-12022-9-1Thursday, September 01, 202210、阅读一切好书如同和过去最杰出的人谈话。2022-9-12022-9-12022-9-19/1/2022 4:13:36 PM11、越是没有本领的就越加自命不凡。2022-9-12022-9-12022-9-1Sep-221-Sep-2212、越是无能的人,越喜欢挑剔别人的错儿。2022-9-12022-9-12022-9-1Thursday, September 01, 202213、知人者智,自知者明。胜人者有力,自胜者强。2022-9-12022-9-12022-9-1
27、2022-9-19/1/202214、意志坚强的人能把世界放在手中像泥块一样任意揉捏。2022年9月1日星期四2022-9-12022-9-12022-9-115、最具挑战性的挑战莫过于提升自我。2022年9月2022-9-12022-9-12022-9-19/1/202216、业余生活要有意义,不要越轨。2022-9-12022-9-1September 1, 202217、一个人即使已登上顶峰,也仍要自强不息。2022-9-12022-9-12022-9-12022-9-1,Lorem ipsum dolor sit, eleifend nulla ac, fringilla purus. Nulla iaculis tempor felis amet, consectetur adipiscing elit. Fusce id urna blanditut cursus.,感谢您的下载观看,专家告诉,