C51第四课课件数据描述.ppt_第1页
C51第四课课件数据描述.ppt_第2页
C51第四课课件数据描述.ppt_第3页
C51第四课课件数据描述.ppt_第4页
C51第四课课件数据描述.ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

1,本章知识点: keil环境安装,补丁,破解使用过程 不同类型数据间的转换 变量的作用域 运算符和表达式,第四课 数据类型,2,隐式转换 什么情况下发生 运算转换-不同类型数据混合运算时 赋值转换-把一个值赋给与其类型不同的变量时 输出转换-输出时转换成指定的输出格式 函数调用转换-实参与形参类型不一致时转换 运算转换规则:不同类型数据运算时先自动转换成同一类型,1.不同类型数据间的转换,3,char ch; int i; float f; double d;,ch/i + f*d - (f+i),例1,4,一般形式:(类型名)(表达式) 例: (int)(x+y) (int)x+y (double)(3/2) (int)3.6 说明:强制转换得到所需类型的中间变量,原变量类型不变,例 main() float x; int i; x=3.6; i=(int)x; printf(“x=%f,i=%d”,x,i); 结果:,精度损失问题,显式转换(强制转换),x=3.600000,i=3,5,2.变量的作用域, int x=2; int x=3; printf(“x=%dn“,x); printf(“x=%dn“,x); ,2.1块结构:代码“块”指的是包含在一对大括号中的0行或多行代码序列。在块内可以对变量进行定义,其作用域仅限于块内。,x=3,x=2,6,2.变量的作用域,概述 变量是对程序中数据的存储空间的抽象,编译或函数调用时为其分配内存单元,10,程序中使用变量名对内存操作,7,2.变量的作用域,变量的属性 数据类型:变量所持有的数据的性质(操作属性) 存储属性 存储器类型:寄存器、静态存储区、动态存储 生存期:变量在某一时刻存在-静态变量与动态变量 作用域:变量在某区域内有效-局部变量与全局变量 变量的存储类型 auto -自动型 register-寄存器型 static -静态型 extern -外部型 变量定义格式: 存储类型 数据类型 变量表;,概述:变量是对程序中数据的存储空间的抽象,如: int sum; auto int a,b,c; register int i; static float x,y;,8,2.2变量作用域说明: 变量只能在定义它或说明它的范围内使用,而在该范围之外是不可见的。 按作用域的大小可分为程序级、文件级、函数级及复合语句级(块级)。 其中程序级的作用域最大,属于程序级作用域的有外部变量,在构成程序的所有文件中都是可见的。属于文件级的作用域的有外部静态变量,外部变量和外部静态变量合称为全局变量或全程变量。属于函数级、复合语句级的变量称为局部变量或内部变量。,2.变量的作用域,9,2.3自动型变量(局部变量): 在函数内部定义的变量称为自动型变量。以关键字“auto”来定义。声明一个局部变量,不加任何修饰的话,它默认为auto,如 char ch; = auto char ch; 一般省略auto关键字。 作用域: 编译器为自动型变量动态分配存储空间。它只存在于块内(由组成一个块) 一旦离开该块,变量就消失,不存在。 不同的函数内可以定义同样名字的变量。,2.变量的作用域,10,自动型变量特点: (1)在一个函数内部定义的变量,只能在函数内部(块内部)使用。 (2)在主函数内部定义的变量也是局部变量。 (3)形式参数是局部变量。 (4)局部变量在函数被调用的过程中占有存储单元。 (5)不同函数中可以使用同名变量。在不同的作用域内,可以对变量重新进行定义。,2.变量的作用域,11,2.4外部型变量: 在任何函数外部定义的变量称为外部型变量,它可以被一个程序中所以函数所引用。 作用域: 外部变量实际是“全局型”,它的作用域是整个程序。主要用来做函数之间的数据通信。,2.变量的作用域,12,2.变量的作用域,2.4外部型变量特点 (1)在函数外部定义,其作用域是变量定义位置至整个程序文件结束。 (2)使用外部变量,可增加函数间数据联系的渠道。全局变量可以将数据带入在作用域范围内的函数,也可以将数据带回在作用域范围内的其它函数。使用全局变量可让函数带回多个值,但一定要注意全局变量传递数据是数据传递的后门。全局变量在程序中任何地方都可以更新,使用全局变量会降低程序的安全性。 (3)使用程序中非本程序文件的外部变量,也要对使用的外部变量进行申明(extern)。 (4)局部变量如与外部变量同名,则在局部变量的作用域内,外部变量存在,但不可见,外部变量的作用被屏蔽。 (5)全局变量在程序运行过程中均占用存储单元。 (6)在编程时,原则上尽量少用全局变量;能用局部变量,不用全局变量,要避免局部变量全局化。,13,2.变量的作用域,2.5静态变量: 静态变量的类型说明符是static。 静态变量是属于静态存储方式,编译器为其分配固定的存储空间。外部变量前由 static加以定义后成为静态外部变量,或称静态全局变量。 对于自动变量,它属于动态存储方式。 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。 1. 静态局部变量 在局部变量的说明前再加上static说明符就构成静态局部变量。 例如: static int a,b; static float array5=1,2,3,4,5; 2.静态全局变量 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。这两者在存储方式上并无不同。一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效。,14,2.变量的作用域,静态局部变量具有以下特点: (1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。但退出该函数后, 尽管该变量还继续存在,但不能使用它。 (2)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜,15,2.变量的作用域,静态全局变量具有以下特点: (1)由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。 从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。,16,2.变量的作用域,局部变量默认为auto型 register型变量个数受限, sfr,sbit。 局部static变量具有全局寿命和局部可见性 局部static变量具有可继承性 extern不是变量定义,可扩展外部变量作用域,17,2.4 运算符和表达式,18,运算符功能 与运算量关系 要求运算量个数 要求运算量类型 运算符优先级别 结合方向 结果的类型,学习运算符应注意,19,基本算术运算符: + - * / % 结合方向:从左向右 优先级: - -* / % - + - (2) (3) (4) 说明: “-”可为单目运算符时,右结合性 两整数相除,结果为整数 %要求两侧均为整型数据,例 5/2 = -5/2.0 =,例 5%2 = -5%2 = 1%10 = 5%1 = 5.5%2,算术运算符和表达式,2,-2.5,1,-1,1,0,(),20,作用:使变量值加1或减1 种类: 前置 +i, -i (先执行i+1或i-1,再使用i值) 后置 i+,i- (先使用i值,再执行i+1或i-1),例 j=3; k=+j; j=3; k=j+; j=3; printf(“%d”,+j); j=3; printf(“%d”,j+); a=3;b=5;c=(+a)*b; a=3;b=5;c=(a+)*b;,/k=4,j=4,/k=3,j=4,/4,/3,/c=20,a=4,/c=15,a=4,自增、自减运算符+ -,21,作用:使变量值加1或减1 种类: 前置 +i, -i (先执行i+1或i-1,再使用i值) 后置 i+,i- (先使用i值,再执行i+1或i-1),说明: + - 不能用于常量和表达式,如5+,(a+b)+ + -结合方向: 自右向左 优先级:- + - -* / % -+ - (2) (3) (4),例 -i+ -(i+) i=3; printf(“%d”,-i+); /-3,例 -i+ i=3; printf(“%d”,-i+);,自增、自减运算符+ -,22,简单赋值运算符 符号: = 格式: 变量标识符=表达式 作用:将一个数据(常量或表达式)赋给一个变量,复合赋值运算符 种类:+= -= *= /= %= = = &= = |= 含义: exp1 op= exp2 exp1 = exp1 op exp2,例 a=3; d=func(); c=d+2;,赋值运算符和表达式,23,结合方向:自右向左 优先级: 14 左侧必须是变量,不能是常量或表达式,赋值表达式的值与变量值相等,且可嵌套,赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型,例 3=x-2*y; a+b=3;,例 float f; int i; i=10; f=i; 则 f=10.0,例 int i; i=2.56; /结果i=2;,例: a=b=c=5 a=(b=5) a=5+(c=6) a=(b=4)+(c=6) a=(b=10)/(c=2),/表达式值为5,a,b,c值为5,/ b=5;a=5,/表达式值11,c=6,a=11,/表达式值10,a=10,b=4,c=6,/表达式值5,a=5,b=10,c=2,说明(1):,24,结合方向:自右向左 优先级: 12 左侧必须是变量,不能是常量或表达式,赋值表达式的值与变量值相等,且可嵌套,赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型,例: a=12; a+=a-=a*a,例: int a=2; a%=4-1; a+=a*=a-=a*=3;,/a=-264 等价于a=a+(a=a-(a*a),/a=0 等价于a=a+(a=a*(a=a-(a=a*3),说明(2):,25,形式:表达式1,表达式2,表达式n 结合性:从左向右 优先级: 15 逗号表达式的值:等于表达式n的值 用途:常用于循环for语句中,例 a=3*5,a*4 a=3*5,a*4,a+5 例 x=(a=3,6*3) x=a=3,6*a 例 a=1;b=2;c=3; printf(“%d,%d,%d”,a,b,c); printf(“%d,%d,%d”,(a,b,c),b,c);,/a=15,表达式值60,/a=15,表达式值20,/赋值表达式,表达式值18,x=18,/逗号表达式,表达式值18,x=3,/1,2,3,/3,2,3,逗号运算符和表达式,例: /*ch2_6.c*/ #include main() int x,y=7; float z=4; x=(y=y+6,y/z); printf(“x=%dn“,x); ,运行结果:x=3,26,关系运算符 种类:= != 结合方向:自左向右 优先级别:,例 ca+b /c(a+b) ab!=c /(ab)!=c a=bc /a=(bc),关系表达式的值:是逻辑值“真”或“假”,用1和0表示,例 int a=3,b=2,c=1,d,f; ab (ab)=c b+cb f=abc,/表达式值1,/表达式值1,/表达式值0,/d=1,/f=0,关系运算符和表达式,27,例 若a=0; b=0.5; x=0.3; 则 a=x=b的值为,0,例 5278在C中是允许的, 值为,0,例 int i=1, j=7,a; a=i+(j%4!=0); 则a=,2,例 a0 结果为 A100 结果为,1,0,关系运算注意(1),28,例 注意区分“=”与“=” int a=0,b=1; if(a=b) printf(“a equal to b”); else printf(“a not equal to b”);,例 应避免对实数作相等或不等的判断 如 1.0/3.0*3.0=1.0 结果为 可改写为:fabs(1.0/3.0*3.0-1.0)1e-6,0,关系运算注意(2),29,逻辑运算符 种类: ! & | 逻辑运算真值表,C语言中,运算量: 0表示“假”, 非0表示“真”, 运算结果: 0表示“假”, 1表示“真”,逻辑运算符和表达式(1),30,例 ab&xy a=b|x=y !a|ab,优先级:,结合方向:,/ (a=x) & (x=b),/(ab)&(xy),/(a=b)|(x=y),/(!a)|(ab),逻辑运算符和表达式(2),31,优先级:,结合方向:,例 a=4;b=5; !a a&b a|b !a|b 4&0|2 53&2|84-!0 c&d,值为1,值为0,值为1,值为1,值为1,值为1,/(53)&2|(8(4-(!0) 值为1,逻辑运算符和表达式(3),32,优先级:,结合方向:,短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符,例 a (m=ab)&(n=cd),/结果m=0,n=1,逻辑运算符和表达式(4),33,一般形式: expr1 ? expr2 : expr3 执行过程 功能:相当于条件语句,但不能取代一般if语句,例 求 a+|b| printf(“a+|b|=%dn”,b0?a+b:a-b);,例 (a=b)?Y:N (x%2=1)?1:0 (x=0)?x:-x (c=a & c=z)?c-a+A:c,条件运算符可嵌套 如 x0?1:(x0?-1:0) 优先级: 13,结合方向:自右向左 如 ab?a:cd?c:d ab?a:(cd?c:d) expr1、expr2、expr3类型可不同,表达式值取较高的类型,例 x?a:b /x=0,表达式值为b; x0,表达式值为a xy?1:1.5 /xy ,值为1.0; xy ,值为1.5,条件运算符与表达式,34,练习:,1.sizeof()运算符为单目运算符,

温馨提示

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

评论

0/150

提交评论