《算术运算符、表达式赋值运算与逗号运算.ppt》由会员分享,可在线阅读,更多相关《算术运算符、表达式赋值运算与逗号运算.ppt(22页珍藏版)》请在金锄头文库上搜索。
1、第4讲算术运算符、表达式 赋值运算与逗号运算 &整型变量n占字节数随机器不同而不同,一般占一个机器字nshortintlongn可用sizeof(类型标识符)测量&实型变量nfloat:占4字节,提供7位有效数字ndouble:占8字节,提供1516位有效数字&字符型变量n字符变量存放字符ASCII码nchar与int数据间可进行算术运算复习2.6 算术运算符1.基本算术运算符有:基本算术运算符有: 、*、/、% 注意事项注意事项两个整型数据相除的结果只能为整型数值,如两个整型数据相除的结果只能为整型数值,如72的的结果为结果为3 “+”或或“-” 用作单目运算符时只能有一个运算量,用作单目运
2、算符时只能有一个运算量,如如x=-5,则则+x的值还是的值还是-5,而,而-x的值为的值为+5。 求余运算只能在两个整型数据之间进行,如求余运算只能在两个整型数据之间进行,如9%5的值的值为为4,而,而9.5%3为非法的运算为非法的运算 当运算量为负数时,所得结果的符号未作明确的规定。当运算量为负数时,所得结果的符号未作明确的规定。TURBO C系统规定余数的符号与被除数相同。系统规定余数的符号与被除数相同。 2. 算术表达式用算术运算符和圆括号将函数和运算对象(如常用算术运算符和圆括号将函数和运算对象(如常量、变量等)按一定的规则连接起来就可以构成量、变量等)按一定的规则连接起来就可以构成一
3、个算术表达式,如:一个算术表达式,如:(ab)*c5.0、x*y2*sin(z)等都是算术表达式等都是算术表达式 表达式都有一个值,即运算结果。表达式都有一个值,即运算结果。 应该注意表达式中运算符的应该注意表达式中运算符的优先级优先级和和结合性结合性优先级用于决定运算中的运算顺序,即有多个运算符优先级用于决定运算中的运算顺序,即有多个运算符出现时,哪一个先计算,哪一个后计算。出现时,哪一个先计算,哪一个后计算。结合性则决定同一优先级的运算符之间的运算顺序,结合性则决定同一优先级的运算符之间的运算顺序,即是即是先左后右先左后右还是还是先右后左先右后左。P264P264附录附录C C 运算符名称
4、优先级结合性( )括号15(最高)自左至右 下标指向结构体成员结构体成员!逻辑非14自右至左按位取反增1减1&取地址*取内容+、正、负号(类型)强制类型转换sizeof计算类型长度*乘13自左至右除%求余加12自左至右减按位左移11自左至右按位右移大于10自左至右小于大于或等于小于或等于等于9自左至右!不等于&按位与8自左至右按位异或7自左至右按位或6自左至右&逻辑与5自左至右逻辑或4自左至右?:条件运算3自右至左赋值2自右至左 * 复合运算% & ,逗号1(最低)自左至右关于结合性所谓结合性是指,当一个操作数两侧的运算符具有相同的优先级时,该操作数是先与左边的运算符结合,还是先与右边的运算符
5、结合。3. 算术运算中的类型转换在在C语言中要求参加运算的语言中要求参加运算的两个运算量是同一数两个运算量是同一数据类型据类型,而运算结果也是该数据类型。,而运算结果也是该数据类型。对数据类型不一致的两个运算量,系统会进行数对数据类型不一致的两个运算量,系统会进行数据类型转换,将其中的一个低级别类型的数据向据类型转换,将其中的一个低级别类型的数据向另一个高级别类型的数据转换(按空间大小和数另一个高级别类型的数据转换(按空间大小和数值范围),然后才进行相应的算术运算,运算的值范围),然后才进行相应的算术运算,运算的结果为其中高级别类型的数据。结果为其中高级别类型的数据。 高高doublefloa
6、tlong(unsignedlong)低低int(unsignedint)shortint、char图图2.4算术运算中的类型转换算术运算中的类型转换n隐式转换n什么情况下发生n运算转换-不同类型数据混合运算时n赋值转换-把一个值赋给与其类型不同的变量时n输出转换-输出时转换成指定的输出格式n函数调用转换-实参与形参类型不一致时转换n运算转换规则:不同类型数据运算时先自动转换成同一类型doublefloatlongunsignedintchar,short低高说明:必定的转换运算对象类型不同时转换例 char ch; int i; float f; double d;ch/i + f*d -
7、(f+i)intintdoubledoubledoubledoubledoubledoubleintintdoubledoubledoubledoubledoubledouble10+a +i*f - d/l例 int i; float f; double d; long l;3.强制类型转换运算符当当自自动动类类型型转转换换不不能能达达到到目目的的时时,可可以以使使用用强强制制类类型型转转换换运运算算符符。强强制制类类型型转转换换运运算算符符就就是是用用一一对括号括起来的类型名标识符,其一般格式为:对括号括起来的类型名标识符,其一般格式为: ( (类型名标识符类型名标识符)()(表达式表达式
8、) ) 例例如如:假假设设x x为为floatfloat类类型型,则则表表达达式式“x%3x%3”是是不不合合法法的的,因因为为% %运运算算符符要要求求其其两两侧侧的的数数据据都都必必须须是是整整型型数数据据。可可以以使使用用表表达达式式“( (intint)x%3)x%3”达达到到求求余余数数的的目目的的,即即先先将将实实型型变变量量x x强强制制转转换换为为整整型型值,然后再进行取余运算。值,然后再进行取余运算。 n显式转换(强制转换)n一般形式:(类型名)(表达式)例 (int)(x+y) (int)x+y (double)(3/2) (int)3.6 n说明:强制转换得到所需类型的中
9、间变量,原变量类型不变 例 main() float x; int i; x=3.6; i=(int)x; printf(“x=%f,i=%d”,x,i); 结果:x=3.600000,i=3精度损失问题较高类型向较低类型转换时可能发生Ch2_007.cCh2_008.c2.7 赋值运算符与赋值表达式 变量的值在程序的运行过程中能够发生变化主变量的值在程序的运行过程中能够发生变化主要是通过对变量进行赋值来完成的。如果在程序要是通过对变量进行赋值来完成的。如果在程序中没有赋值操作,则变量的值也就不会发生变化。中没有赋值操作,则变量的值也就不会发生变化。 1.1.赋值运算符赋值运算符()的作用是把
10、一个数据或表达()的作用是把一个数据或表达式的值赋给一个变量。式的值赋给一个变量。例如:例如:x=3x=3赋值运算符的左边只能是变量,不允许是算术表赋值运算符的左边只能是变量,不允许是算术表达式或常量。达式或常量。例如:例如:x+1=3x+1=3赋值运算符与数学中的等号不同,赋值运算符求赋值运算符与数学中的等号不同,赋值运算符求解以后能够得到一个运算结果。解以后能够得到一个运算结果。 2. 赋值表达式由赋值运算符将一个变量和一个表达式连接起来由赋值运算符将一个变量和一个表达式连接起来的式子称为赋值表达式。的式子称为赋值表达式。赋值表达式的一般形式为:赋值表达式的一般形式为:变量变量 = 表达式
11、表达式 例如:例如:x=3*5x=3*5执行过程执行过程:先将赋值运算符右边表达式的值求出:先将赋值运算符右边表达式的值求出来,然后将该值赋给左边的变量,被赋值变量的来,然后将该值赋给左边的变量,被赋值变量的值就是整个赋值表达式的值。值就是整个赋值表达式的值。3. 复合的赋值运算符复合的赋值运算符是在赋值运算符的前面加上其复合的赋值运算符是在赋值运算符的前面加上其复合的赋值运算符是在赋值运算符的前面加上其复合的赋值运算符是在赋值运算符的前面加上其它的运算符组合而成的新运算符。它的运算符组合而成的新运算符。它的运算符组合而成的新运算符。它的运算符组合而成的新运算符。1010种复合赋值运算符分别是
12、:种复合赋值运算符分别是:种复合赋值运算符分别是:种复合赋值运算符分别是: * * % % & & ! ! 例如:例如:x+=3 x+=3 等价于等价于 x=x+3x=x+3。 x%=3 x%=3 等价于等价于 x=x%3x=x%3。注意:这些运算符都是由多个字符组合而成的,注意:这些运算符都是由多个字符组合而成的,其字符之间不允许有空格。其字符之间不允许有空格。 a+=3a=a+3x*=y+8x=x*(y+8)x%=3x=x%34. 自加、自减运算符自加(自加(+)自减()自减(-)运算符的作用是使变量的)运算符的作用是使变量的值自动加(减)值自动加(减)1。自加、自减运算符是单目运算符。自
13、加、自减运算符是单目运算符。执行过程执行过程变量在自加自减运算符之前(变量在自加自减运算符之前(k+k+或或k-)k-)时,先使用时,先使用变量的值,然后自加或自减。变量的值,然后自加或自减。 如:如:k=3;x=5+k+;k=3;x=5+k+;结果结果x的值为的值为8 8,k k的值为的值为4 4。变量在自加自减运算符之后(变量在自加自减运算符之后(+k+k或或-k)-k)时,先自加时,先自加或自减,然后使用变量的值。或自减,然后使用变量的值。 如:如:k=3;x=+k+5;k=3;x=+k+5;结果结果x的值为的值为9 9,k k的值为的值为4 4。注意:注意:自增自减运算只能针对简单变量
14、而言。自增自减运算只能针对简单变量而言。 例例 自增、自减运算符的用法与运算规则示例。/*程序功能:自增、自减运算符的用法与运算规则示例*/main() int x=6, y; printf(x=%dn,x); /*输出x的初值*/ y = +x; /*前置运算*/ printf(y=+x: x=%d,y=%dn,x,y); y = x-; /*后置运算*/ printf(y=x-: x=%d,y=%dn,x,y); 程序运行结果:x=6y=+x: x=7,y=7y=x-: x=6,y=7 5. 赋值运算中的类型转换 系统自动将赋值运算符右边的数据类型系统自动将赋值运算符右边的数据类型转换成赋
15、值运算符左边变量的类型。转换成赋值运算符左边变量的类型。1.1.将实型数据转换为整型值时直接舍弃实数的小将实型数据转换为整型值时直接舍弃实数的小数部分。数部分。若其值超出整型值的范围则出错。若其值超出整型值的范围则出错。 2.2.将整型值转换为实型值时整数部分取整型值,将整型值转换为实型值时整数部分取整型值,小数部分的值为零。小数部分的值为零。3.3.将双精度的实型数据转换为单精度的实型数据将双精度的实型数据转换为单精度的实型数据时截取其小数部分中前面的时截取其小数部分中前面的7 7位有效数字(十进位有效数字(十进制数),指数部分保持不变。制数),指数部分保持不变。超值错。超值错。赋值运算中的
16、类型转换(续)4.4.将整型数据转换为取值范围更大的整型数据时,对于有符将整型数据转换为取值范围更大的整型数据时,对于有符号数,用其符号位的值向前扩展。对于无符号数,则用号数,用其符号位的值向前扩展。对于无符号数,则用0 0向前扩展。向前扩展。5.5.将整型数据转换为取值范围更小的整型数据时,按所需将整型数据转换为取值范围更小的整型数据时,按所需的位数的位数从低位直接截取从低位直接截取。超值错。超值错。6 6同等长度的整型数据和无符号整型数据之间的转换。同等长度的整型数据和无符号整型数据之间的转换。2.8 逗号运算符与逗号表达式 逗号运算符逗号运算符(,)又称为顺序求值运算符)又称为顺序求值运算符由逗号运算符把若干个独立的表达式连接由逗号运算符把若干个独立的表达式连接起来构成逗号表达式,逗号表达式的一般起来构成逗号表达式,逗号表达式的一般形式为:形式为:表达式表达式1, ,表达式表达式2, ,表达式表达式3, , , ,表达式表达式n求值顺序求值顺序 从左至右,最后一个表达式的从左至右,最后一个表达式的值就是整个逗号表达式的值值就是整个逗号表达式的值例如:例如:x=2,y=x+4,z=x*y x=2,y=x+4,z=x*y 其值为其值为1212第二章 作业教材P25 习题二 一、4,5,6,7,8,9,10,14二、1,2,3