C51第四课课件数据描述.ppt
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()运算符为单目运算符,它返回一个变量或者类型的字节数。float f:int i;i=sizeof(f);i=?,35,练习:,2.下面程序中输出的结果为?。,例 main()float x;x=c-a;printf(“x=%f”,x);结果:,x=2.000000,36,练习:,3.下面程序中输出的结果为?。,例 static int x;main()static float x;x=e-a;printf(“x=%f”,x);结果:,x=3.000000,毕业设计(论文)任务书,37,练习:,4.下面程序中a的结果为?,毕业设计(论文)任务书,例:a=2;a+=a+=a*a,/a=12等价于a=a+(a=a+(a*a),38,练习:,5.下面程序中a的结果为?,毕业设计(论文)任务书,例:bit a;int b=5,c=3,d=2 a=bcd;,/a=0,39,练习:,6.下面程序中x的结果为?,毕业设计(论文)任务书,例:int x=5,y=3;x*=y+4;,/x=35,40,练习:,7.下面程序中x的结果为?,毕业设计(论文)任务书,/a=2,例 int i=1,j=7,a;a=i+(j%4!=0);则a=,41,练习:,8.下面程序中x的结果为?,毕业设计(论文)任务书,/a=1,例 int i=1,j=7,a;a=i 则a=,42,实践课安排:,1.按学号固定座位。每个人以后均按此顺序使用计算机。2.时间上面分两个班级上课。3.每个人均需完成程序设计。4.完成实验报告。,