资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第3章 运算符和表达式,本章的学习重点,运算符与表达式的分类,算术运算符与算术表达式,逻辑运算符与逻辑表达式,关系运算符与关系表达式,位运算符,条件运算符,强制类型转换,1,3.1 运算符与表达式的分类,运算符的分类:可按照操作对象数目分类,例如一元运算符、二元运算符和三元运算符等,也可按照功能分类,例如算术运算符、逻辑运算符、关系运算符等。,表达式的分类:主要按照运算符的不同功能进行分类,例如算术表达式、逻辑表达式、关系表达式等。,2,3.1.1 运算符的分类,按照操作对象的多少,运算符主要可分为一元运算符、二元运算符和三元运算符。例如负号(-)为一元运算符,加号(+)为二元运算符等。除了这些根本运算符之外,C语言还支持复合运算符以及sizeof运算符等。,按照功能分类,运算符可分为:算术运算符、赋值运算符、逻辑运算符、关系运算符、条件运算符、位运算符、取字节数运算符等。,3,3.1.1 运算符的分类,表3-1 运算符分类,4,3.1.2 表达式的分类,表达式是一种有值的语法结构,它一般由运算符将变量、常量或函数返回值结合而成。,表达式按照运算符的不同进行分类,主要有:算术表达式、逻辑表达式和关系表达式等。,1算术表达式,一般由算术运算符和控制运算优先级的括号连接而成,例如:3.14159*r,(a+b)/c+d*m.其中,符号*表示算术运算“乘,/表示算术运算“除。,2赋值表达式,一般由赋值运算符、算术运算符和操作对象组合而成。一般表达形式为:变量=表达式或数值 或者 变量1=变量2=变量3=表达式或数值。,5,3.1.2 表达式的分类,3逻辑表达式,一般由逻辑运算符和操作对象组合而成,例如:a&b,c|d&m,!x等。,4关系表达式,一般由关系运算符和操作对象组合而成,例如:a b,c 3的值为1,即为真,而表达式-10的值为0,即为假。,范例3.6 RelationOperater.c 程序分析关系运算符的优先级,验证在同一表达式中有算术运算符和关系运算符时程序执行顺序,分析关系运算符的结合性,分析关系表达式的真和假。,注意:判断两个对象是否相等,使用运算符=或!=,一定与赋值运算符=区分开来。,19,3.6 逻辑运算符与逻辑表达式,语言中提供了三种逻辑运算符:,逻辑与(&)、逻辑或(|)和逻辑非(!)。,前两种为双目运算符,具有左结合性。后一种为单目运算符,具有右结合性。,逻辑表达式的值:“真(1)和“假(0)两种。逻辑表达式中总是将0作为假,非0作为真。,逻辑表达式的一般形式为:,操作对象1 逻辑运算符 操作对象2,20,3.6.1 逻辑与(&),逻辑与运算(&):,参与运算的两个操作对象都为真(非0)时,结果为真(1),否则为假(0)。例如,表达式-42&3!=5,由于表达式02为假,因此便不再判断表达式3!=5,而直接认为原表达式为假(0)。,范例3.7 LogicAndOperater.c 程序分析逻辑与运算符的优先级与结合性,并分析逻辑与表达式执行过程中对两侧表达式执行顺序的影响。,21,3.6.2 逻辑或(|),逻辑或运算(|):,参与运算的两个操作对象只要有一个为真(非0),结果即为真(1),否则为假(0)。例如,表达式-410|3=0,表达式中|优先级低于关系运算符和=,所以表达式等价于(-410)|(3=0),表达式-410为真,因此原表达式的结果为真。,C语言规定,当运算符左边为真(非0)时,即判断表达式为真(1),而不再判断运算符右边是否为真或假。例如,表达式2|3!=5,由于常量2为真(非0),因此便不再判断表达式3!=5,而直接认为原表达式为真(1)。,范例3.8 LogicOrOperater.c 程序分别设置逻辑与表达式和逻辑或表达式。在范例3.7根底上进一步分析逻辑与表达式的执行顺序,分析逻辑或的执行顺序,并与逻辑与表达式进行比较。分析产生的结果。,22,3.6.3 逻辑非(!),逻辑非运算(!):,一元运算符,该运算符只能放在操作对象左边。当操作对象为真(非0)时,结果为假(0),操作对象为假(0)时,结果为真。,范例3.LogicNoneOperator.c 程序分析逻辑非表达式的真和假,验证当变量a为非0时,!a的含义,并分析复合逻辑运算时表达式的执行顺序与结果。,23,实训3.2判断闰年,CalculateLeapYear.c,年数中分为平年或闰年,编写程序,判断输入年数是闰年还是平年,闰年输出为1,平年输出为0。,闰年判断公式:,(year%4=0)&(year%100!=0)|(year%400=0)。,需求分析:,需求1:输入年数,需求2:使用逻辑运算符判断输入的年数是否为闰年,24,3.7 位运算符,位运算:,对操作对象中的比特位(bit)进行移位、重置以及逻辑判断等操作。,位运算只能用于字符型(char)或整型(int,short,long等),不能用于float、double、void或其他复杂类,表-位运算符,运算符,意义,表达式,运算功能,按位取反,a,a按位取反,按位左移,b,按位右移,c3,c右移3位,&,按位与,a&b,a和b按位与,按位异或,ab,a和b按位异或,|,按位或,a|b,a和b按位或,25,3.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。,26,3.7 位运算符,范例3.10 LogicBitAnd.c使用位&操作取变量a的低10bit位,其余位置零,并使用十六进制打印结果。方法为使变量a与另一常量作&,该常量低10位为1,其余位为0。,2按位或(|),规则:有一个操作对象对应位为1时,结果即为1,当两个操作对象对应位都为为0时,结果才为。例如:35的计算方法为:先转化为二进制,然后按位进行或操作。,0000 0011,0000 0101,-结果为0000 0111,27,3.7 位运算符,3按位异或(),规则:操作对象对应位相同时为1,不同时为0。例如35的计算方法为:先转化为二进制,然后按位进行异或操作。,0000 0011,0000 0101,-结果为0 xF9,十进制数249,1111 1001,用途:,按位异或()主要用于将操作对象的的某些位翻转(原来为1的位变为0,为0的变为1),其余各位不变。,28,实训3.3交换两变量的值,ExchangeTwoVariable.c,编写程序,不使用其他中间变量,交换两个整型变量a和b的值。使用按位异或()交换两变量的值。使用异或操作置位两变量对应位不同的位置,并依次交叉操作,到达两值交换的功能,本例主要使用一个变量存储了两个变量信息的特性。,需求分析:,需求1:交换两个变量的值,需求2:不使用中间变量,实现:,使用按位异或()运算符,完成操作,方法为:首先将变量a和b作异或操作,将结果赋给a,然后将b与a作异或操作,并将结果赋给b,重复第一步操作,完成。,29,3.7 位运算符,4按位取反(),按位取反操作是将操作对象各位翻转,即原来为1的位变成0,原来为0的位变成1。例如:,1111 1111 0001 0011,-,0000 0000 1110 1100,用途:,按位取反操作主要用于间接地构造一个数,以增强程序的可移植性。,30,3.7 位运算符,5按位左移(),操作使操作对象的各位右移,高位补0,低位舍弃。与左移类似,操作对象和右移位数只能是整型或字符型。,31,3.8 条件运算符,条件运算符:,C语言中唯一一个三元运算符(三目运算符),其一般表达形式为:,(表达式1)?表达式2:表达式3,规则:假设表达式1的值为真(非0),则表达式的值为表达式2,否则为表达式3。例如:,(ab)?a+b:a-b,当a=10,b=5,c=2时,该表达式的执行过程如下:,首先计算表达式ab是否为真,经运算为真,因此,表达式的值为a+b,即为15。,32,实训3.4分段函数计算,MulitPartFunction.c,键盘输入变量x的值,使用条件运算符判断函数y的值,并输出x和y的值。编写程序,实现分段函数:,需求分析:,需求1:键盘输入变量x的值,需求2:使用条件运算符判断变量x的值,并确定y的值,思路:,判断键盘输入的变量x的值,假设x10,则y的值为10。,33,3.9 sizeof运算符,sizeof运算符:,又称为取内存字节运算符,C语言最特殊的运算符之一,用于计算操作对象在内存中所占的字节数。例如:,int a=10,b=0;,b=sizeof(a);,b用于存储变量a在内存中所占字节数,使用sizeof获取a的内存字节数。,范例3.11 SizeofUseful.c使用sizeof运算符分别获取char short int long float double等几种根本数据类型的内存字节数,获取实型常量1.0以及字符常量a的内存字节数,获取强制类型转换之后的字符常量a的内存字节数。,34,3.10 强制类型转换,功能:,将表达式的运算结果强制转换成类型说明符所表示的类型。其中,类型说明符必须使用括号括起来。例如:(int)m表示把m转换为整型,(double)(a*b+c)表示把表达式a*b+c的值转换为双精度浮点型。,注意:,第一,类型说明符必须加括号;,第二,表达式应该加括号,假设表达式仅为单个变量可以不加;,第三,强制类型转换不改变被转换对象,仅仅为本次运算所需而进行的操作。,35,3.10 强制类型转换,范例3.11 CalcVandS.c计算半径r,高h 的圆柱形桶的体积V和外表积S,取圆周率为3.14,要求计算结果为整型并输出,体积V四舍五入,外表积S仅取整数局部。,36,
展开阅读全文