




已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章 表达式和运算符(3),3.5 运算符和表达式,3.5.1 运算符的种类、优先级和结合性 3.5.2 算术运算符和算术表达式 3.5.3 赋值运算符和赋值表达式 3.5.4 增量运算符和增量表达式 3.5.8 逗号运算符和逗号表达式,3.5运算符和表达式,运算符和表达式,优先级是指表达式中包含多个运算符时,先进行优先级高的运算符操作,然后进行优先级低的运算符操作; 当表达式中包含的几个运算符的优先级全相同时,由运算符的结合性来决定他们的运算顺序。 结合性: 同一优先级,自左向右,为左结合性,反之为右结合性。,初等运算符( 、( )、 . 、- ) 单目运算符 算术运算符 关系运算符 逻辑运算符(不包括逻辑非运算符!) 赋值运算符 逗号运算符,3.5.2算术运算符和算术表达式,1、基本的算术运算符: (加法运算符,或正值运算符。如:、) (减法运算符,或负值运算符。如:、) * (乘法运算符。如:*) (除法运算符。如:) (模运算符,或称求余运算符,两侧均应为整型数据,如:的值为)。 算术运算符的优先级别: *、/、%优先于 + 、 (*、/、%不分) ,()级别最高,单目运算符优先双目运算符 如 2 4,算术运算符和算术表达式,2、算术表达式 (1)表达式 由常量、变量、函数和运算符组成的式子称为表达式 例:计算圆面积的语句 s=3.14159*r*r; 该语句中r,3.14159,3.14159*r,3.14159*r*r, s=3.14159*r*r都是表达式 *是运算符, 3.14159是常量,s是变量 (2)表达式的求值规则,按照运算符的优先级和结合性的规定顺序进行。一个表达式有一个值及其类型,算术运算符和算术表达式,(3)算术表达式 是由算数运算符和操作数组合成的式子,算术表达式用于各类数值运算。除求余运算符%外,运算对象可以是整型,也可以是实型。 如:(-b-sqrt(d)/(2.0*a) 运算对象包括常量、变量、函数等。 一个常量、变量都可作为一个表达式。 例: 以下是合法的算术表达式: a*b/c-1.5+ a 3*x+1.0/y10*sqrt(x) (x+y)%(x+b-c/d) 100 x,算术运算符和算术表达式,说明: 1)“%”是求余运算。a%b计算a除以b以后的余数,也是a模b的值。它要求两个运算对象都是整型量,其结果也是整型量。当运算量为负数时,所得结果的符号与被除数(a)相同。 如:17%-3=2 -19%4=-3 -15%-7=-1 5%1.5是非法的算术表达式 2)除法运算符“/”进行求商运算。对于不同类型的运算对象,除法表达式计算结果的类型也会不同。 例:计算x/y 如果x,y为整型,小数部分舍去,没有四舍五入 如果x,y中有一个为实型量,则x,y都被化为double类型进行计算,结果为double,算术运算符和算术表达式,运算实例: x,y为整型量:5/2结果为2,整型量 2/5结果为0,整型量 x,y其中一个为实型量 5.0/2或 5.0/2.0或 5.0/2.0结果为2.5,实型量,练习:,例 1/2 = -5/2 = -5/2.0 =,例 5%2 = -5%2 = 5%-2 = 1%10 = 5%1 = 5.5%2 =,0 -2 -2.5,1 -1 1 1 0 ,例: a*b/c-1.5+ a (x+y)%(x+b-c/d),例如 (16/32+1)%6的值_. 计算方法:16/3值为5,然后52+l值为9,最后9%6值为3。,算术运算符和算术表达式,3)双目运算符两边的运算类型必须一致才能进行操作,所得结果类型与运算类型一致; 如:1.0/2.0=0.5 1/2=0 4)如果类型不一致,系统将自动把两边转换成相同类型后进行运算; 如:1.0/2=0.5 1/2.0=0.5 整型转实型 短整型转长整型 有符号转无符号 5)C语言中所有实数的运算均以双精度方式进行,若是单精度数,则在尾数部分补0,使之转化为双精度;,例:将数学式改写成算术表达式 一般数学式 算术表达式 a(b+c)+dac (a*(b+c)+d)*a*c 3.14159*r*r/2.0 x/(x+y)+1.0/x*y,算术运算符和算术表达式,基本运算符实例,基本运算符实例: main() int a,b,c1,c2; a=3,b=7; c1=b/a; c2=b%a; printf(“c1=%dtc2=%dn”,c1,c2); c1=a/b; c2=a%b; printf(“c1=%dtc2=%dn”,c1,c2); ,标准库函数调用,对于某些数学运算,如求平方根,指数,对数运算,C语言中有标准库函数对其进行计算。 调用格式:函数名(参数,参数,) 其中函数名由系统提供,不同C编译系统,提供的函数名不同,使用时需查阅相关手册。 调用函数时,参数的类型必须与系统规定一致 调用标准库函数之前,通常要用预编译命令 “#include math.h”将所需要的库函数信息包含到用户源文件中,使用数学库函数,在使用数学库函数以前,需使用编译命令 #include “math.h” 例:计算x(2+xy)的值 #include “math.h” main() double x,y; x=5.0;y=7.0; printf(“z=%fn”,x*(2.0+pow(x,y); ,算术表达式中数据类型的转换,3、各类型数值数据的转换 当表达式中的各类数值型数据参与混合运算时,要进行类型转换 下面表达式合法:1+3.14159+0+A 转换方式 自动转换:数据类型自动由低级向高级转换。 强制转换:将表达式的运算结果强制转换成指定的数据类型。,算术表达式中数据类型的转换,自动转换规则:,低,高,自动,自动,算术表达式中数据类型的转换,练习:,1若有定义:int a; 则语句a=(4 * 5)+ 4 % 5;运行后,a的值为( ) 2设double型变量a,b,c,e均有值;对代数式(3ae)/(bc),不正确的C语言表达式是( )。 (A) a/b/c*e*3 (B) 3*a*e/b/c (C) 3*a*e/b*c (D) a*e/c/b*3 3. P59 3.3 3.4,3.5.3赋值运算符和赋值表达式,1、赋值运算符和赋值表达式 赋值表达式的一般格式为:变量=表达式 说明: 1)赋值运算符左边必须是变量而不能是常量或表达式,右边是合法的c语言表达式; 例:j+3=j a*b=c*4 5=x x+1=y*a+3 错误 2)赋值表达式的值是赋值号左边变量被赋值后的值;正确的表示形式: x=10 x=y n=n+1 3)赋值语句可以连续进行 a=b=7+1 等价于a=(b=(c=0),赋值运算符和赋值表达式,2、复合的赋值表达式 算术运算符“+-*/%”和赋值运算符”=“结合 +=:a+=b+3,等价于a=a+(b+3) -=: a-=b+3,等价于a=a-(b+3) *=:a*=b+3,等价于a=a*(b+3) /=:a/=b+3,等价于a=a/(b+3) %=:a%=b+3,等价于a=a%(b+3) =,=,&=,=,|=,赋值运算符和赋值表达式,注意: 1)复合运算符左边必须是变量 2)复合运算符右边的表达式计算完成后才参与复合赋值运算 3)复合运算符的结合性和优先级等同于简单赋值运算符”=” 4)复合运算符常用于某个变量自身的变化,尤其是当左边的变量名很长时,使用复合运算符书写更方便。书写时,两个运算符之间不能有空格。 5)语言规定可以使用种复合赋值运算符: ,*,|,赋值运算符和赋值表达式,3、赋值类型转换 如果赋值号两边的类型不一致,则将赋值号右边表达式的值的类型转换成赋值号左边变量的类型; 例:float f=1.0 int a=2,b=3; char c=A; f=a+b+c; (f为实型量,结果为70.0),赋值结果与类型转换,说明: 1)实型数据(包括单、双精度)赋给整型变量时,舍弃实数的小数部分。 如:设 i 为整型变量,执行 i = 5.34, i 的值为 5 2)整型数据赋给实型变量时,数值不变,但以浮点数形式存储到变量中。 如:对 float 型变量 f ,执行 f = 23 f 的值为 23.000000 3)double赋给float型变量时,截取其前面7位有效数字,存储到float型变量的存储单元; float型变量赋给double时,有效位扩展到16位,在内存中以8个字节存储,赋值结果与类型转换,例: void main ( ) int i; float f; i = 5.34; f = 23; printf (“i=%d,f=%fn“, i, f ); ,结果:i=5,f=23.000000,赋值结果与类型转换,4)char、int、long等类型的转换 “短”数据赋给“长”变量 符号扩展:若最高位为 1(负数),则变量高字节位补 1;反之,补 0。,void main ( ) char c; short int i; c = 43; i = c; printf ( “ i = %hdn“, i ); c = 376; i = c; printf ( “ i = %hdn“, i ); ,43 -2,赋值结果与类型转换,赋值结果与类型转换, “长”数据赋给“短”变量 截断: 只将数据的低字节位 原封不动送到变量中,void main ( ) short int i; long l = 6324232L; i = l; printf ( “ i = %hdn“, i ); ,赋值结果与类型转换,5)无符号整型与有符号整型,例: void main( ) unsigned a; int b = -1; a = b; printf ( “%d - %un“, b, a ); a = 65534u; b = a ; printf ( “%d - %un“, b, a ); ,结果: -1 - 65535 -2 - 65534,赋值运算符和赋值表达式,赋值表达式 由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。 一般形式为: 例如: “5”是一个赋值表达式,赋值运算符和赋值表达式,对赋值表达式求解的过程是: 求赋值运算符右侧的“表达式”的值; 赋给赋值运算符左侧的变量。 例如: 赋值表达式“=3*5”的值为15,执行表达式后,变量a的值也是15。 注意: 一个表达式应该有一个值 左值 (lvalue) : 赋值运算符左侧的标识符 变量可以作为左值; 而表达式就不能作为左值(如a+b); 常量也不能作为左值,,赋值运算符和赋值表达式,请分析下面的赋值表达式(a=3*5)=4*3 分析:先执行括弧内的运算,将15赋给a,然后执行4*3的运算,得12,再把12赋给a。最后a的值为12,整个表达式的值为12。可以看到(a=3*5)出现在赋值运算符的左侧,因此赋值表达式(a=3*5)是左值 注意:在对赋值表达式(a=3*5)求解后,变量a得到值15执行(a=3*5)=4*3时,实际上是将4*3的积12赋给变量a,而不是赋给3*5 不能写成:a=3*5=4*3,赋值运算符和赋值表达式,赋值表达式也可以包含复合的赋值运算符。 如:a+=a-=a*a 分析:此赋值表达式的求解步骤如下 先进行“*”的运算, 相当于*,a的值为144132。 再进行“”的运算, 相当于=a+(-132),a的值为132-132-264。,赋值运算符和赋值表达式,补充例题 main() int i=5; i+ =i* = i+6; printf(“i=%dn“,i); ,分析表达式i+=i*=i+6的执行过程: 结合方向是“从右到左“,先计算i+6的值为11; 计算后i的值不变仍为5; 再计算i*=11, 相当于i=i*11,因此i=5*11, i的值变成55; 最后计算i+=55, 相当于i=i+55, 因此i=55+55, i的值最后变成110。,赋值运算符和赋值表达式,补充例题 main() int i=-5, j=0x9961, k; unsigned int u; unsigned char ch; u=i; ch=j; k=ch; printf(“u=%x,u=%u,ch=%c,k=%dn“, u, u, ch, k); 运行结果: u=fffb,u=65531,ch=a,k=97,赋值运算符和赋值表达式,例:赋值语句程序实例 main() int a,b,c; a=b=c=9; printf(“a=%d,b=%d,c=%dn”,a,b,c); a=(b=4)+(c=6); printf(“a=%d,b=%d,c=%dn”,a,b,c); a+=b+c; printf(“a=%d,b=%d,c=%dn”,a,b,c); a+=a-=a*=a; a+=a-=a+a; printf(“a=%dn”,a); ,9 9 9,10 4 6,20 4 6,0,赋值运算符和赋值表达式,4、强制类型转换 格式:(数据类型说明符)(表达式) 注意: 1)强制转换属单目运算,运算优先级为2 2)强制转换得到的是中间变量类型,原变量类型不变。 例:int x,y; float z; (float)(x+y); (int) z+x;,例: (double)1/2 的值为0.5, 因为(double)1 将整型数 1 转换成1.0 (双精度类型),1.0/2值为0.5。,赋值运算符和赋值表达式,例3.11强制类型转换。 #include “stdio.h“ main() float x; int i; x=3.6; i=(int)x; printf(“x=%f,i=%dn“,x,i); ,3.5.4增量运算符和增量表达式,1、自增、自减运算符 作用: 自增运算符+: 使变量的值增1 自减运算符-: 使变量的值减1 2、两种形式 前缀形式: +i, -i (在使用i之前,先使i的值加1(减1) 后缀形式: i+, i- (在使用i之后,再使i的值加1(减1),增量运算符和增量表达式,例: j=+i; j=i+; 等价于 等价于 j=i+1; j=i; i=i+1; i=i+1 3、结合方向与优先级: +,-的结合方向:从右至左 +,-的优先级:,例:int j=5, i=1, k, n; n=-+i; k=-j*2;,-2 8,增量运算符和增量表达式,例:若 i=1; j=+i; 则j 的值为2(i先加) 若 i=1; j =i+; 则j 的值为1 (i后加) 运算符和运算对象的关系有“结合方向“ 如:若i=1; j= -i+;则j 的值为-1。( i 后加, i的值为2) 负号与+, -结合方向都是从右到左, 不要看成 j=(-i)+, (- i) +是错误的表达式,最好分成多句。j= -i; i+; 例:若 int k, i=2, j=4; 则表达式 k=(+i)*(j-) 的值是( )。,12,增量运算符和增量表达式,补充补充例题: main() int i=3, j, k, m, n; j=i+*+i; k= -i*-i; m=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年计算机:IT.程序员职业技能资格知识考试题与答案
- 主题婚礼策划与流程
- 全科医学转岗培训课件
- 宣传信息工作培训
- 个人能力培训教程课件
- 物业安全人员岗前培训
- 园林景观设计与施工培训课件
- 车辆维修报账合同协议
- 《金融投资机构介绍》课件
- 《临床诊断胆石症现象》课件
- 附件6工贸高风险企业高危领域较大以上安全风险管控清单
- 国际贸易公司后勤管理岗位职责
- 中国矿业大学专职辅导员招聘真题2024
- 骨科手术切口感染的预防与控制
- 2025年保安证考试答题技巧与试题答案
- 透析营养不良相关知识
- 中级宏观经济学知到课后答案智慧树章节测试答案2025年春浙江大学
- 2025 ACC-AHA急性冠脉综合征患者管理指南解读课件
- 智慧树知到《形势与政策(北京大学)》2025春期末答案
- 绿化工程施工专项施工方案
- 甘肃省历年中考语文古诗欣赏试题汇编(2003-2023)
评论
0/150
提交评论