变量的作用域和生存期.ppt

上传人:小飞机 文档编号:6104698 上传时间:2023-09-24 格式:PPT 页数:33 大小:399KB
返回 下载 相关 举报
变量的作用域和生存期.ppt_第1页
第1页 / 共33页
变量的作用域和生存期.ppt_第2页
第2页 / 共33页
变量的作用域和生存期.ppt_第3页
第3页 / 共33页
变量的作用域和生存期.ppt_第4页
第4页 / 共33页
变量的作用域和生存期.ppt_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《变量的作用域和生存期.ppt》由会员分享,可在线阅读,更多相关《变量的作用域和生存期.ppt(33页珍藏版)》请在三一办公上搜索。

1、7.8 变量的存储属性概述变量是对程序中数据的存储空间的抽象,编译或函数调用时为其分配内存单元,10,程序中使用变量名对内存操作,变量的属性数据类型:变量所持有的数据的性质(操作属性)存储属性存储器类型:寄存器、静态存储区、动态存储区生存期:变量在某一时刻存在-静态变量与动态变量作用域:变量在某区域内有效-局部变量与全局变量变量的存储类型auto-自动型register-寄存器型static-静态型extern-外部型变量定义格式:存储类型 数据类型 变量表;,7.8 变量的存储属性概述变量是对程序中数据的存储空间的抽象,如:int sum;auto int a,b,c;register in

2、t i;static float x,y;,局部变量与全局变量局部变量-内部变量定义:在函数内定义,只在本函数内有效说明:main中定义的变量只在main中有效不同函数中同名变量,占不同内存单元形参属于局部变量可定义在复合语句中有效的变量局部变量可用存储类型:auto register static(默认为auto),全局变量-外部变量定义:在函数外定义,可为本文件所有函数共用有效范围:从定义变量的位置开始到本源文件结束,及有extern说明的其它源文件,应尽量少使用全局变量,因为:全局变量在程序全部执行过程中占用存储单元降低了函数的通用性、可靠性,可移植性降低程序清晰性,容易出错,定义 说明

3、次数:只能1次 可说明多次位置:所有函数之外 函数内或函数外分配内存:分配内存,可初始化 不分配内存,不可初始化,外部变量说明:extern 数据类型 变量表;,外部变量定义与外部变量说明不同,若外部变量与局部变量同名,则外部变量被屏蔽,外部变量可用存储类型:缺省 或 static,float max,min;float average(float array,int n)int i;float sum=array0;max=min=array0;for(i=1;imax)max=arrayi;else if(arrayimin)min=arrayi;sum+=arrayi;return(su

4、m/n);main()int i;float ave,score10;/*Input*/ave=average(score,10);printf(max=%6.2fnmin=%6.2fn average=%6.2fn,max,min,ave);,运行结果:max=13,extern int a,b;int max()int z;z=ab?a:b;return(z);main()printf(max=%d,max();int a=13,b=-8;,运行结果:max=8,int i;main()void prt();for(i=0;i5;i+)prt();void prt()for(i=0;i5;

5、i+)printf(“%c”,*);printf(“n”);,例 外部变量副作用,运行结果:*,动态变量与静态变量存储方式静态存储:程序运行期间分配固定存储空间动态存储:程序运行期间根据需要动态分配存储空间内存用户区,生存期静态变量:从程序开始执行到程序结束动态变量:从包含该变量定义的函数开始执行至函数执行结束,变量存储类型,局部变量默认为auto型register型变量个数受限,且不能为long,double,float型局部static变量具有全局寿命和局部可见性局部static变量具有可继承性extern不是变量定义,可扩展外部变量作用域,例 文件file1.cint a;main().

6、f2;.f1;.f1()auto int b;f2;.f2()static int c;,例 auto 变量的作用域,main()int x=1;void prt(void);int x=3;prt();printf(“2nd x=%dn”,x);printf(“1st x=%dn”,x);void prt(void)int x=5;printf(“3th x=%dn”,x);,运行结果:3th x=52nd x=31st x=1,main()void increment(void);increment();increment();increment();void increment(void

7、)int x=0;x+;printf(“%dn”,x);,例 局部静态变量值具有可继承性,运行结果:1 1 1,main()void increment(void);increment();increment();increment();void increment(void)static int x=0;x+;printf(“%dn”,x);,运行结果:1 2 3,例 变量的寿命与可见性,#include int i=1;main()static int a;register int b=-10;int c=0;printf(-MAIN-n);printf(i:%d a:%d b:%d c:

8、%dn,i,a,b,c);c=c+8;other();printf(-MAIN-n);printf(i:%d a:%d b:%d c:%dn,i,a,b,c);i=i+10;other();,other()static int a=2;static int b;int c=10;a=a+2;i=i+32;c=c+5;printf(-OTHER-n);printf(i:%d a:%d b:%d c:%dn,i,a,b,c);b=a;,-Main-i:1 a:0 b:-10 c:0,-Other-i:33 a:4 b:0 c:15,-Main-i:33 a:0 b:-10 c:8,-Other-i

9、:75 a:6 b:4 c:15,8,4,33,15,4,43,6,75,15,6,main()void gx(),gy();extern int x,y;printf(“1:x=%dty=%dn”,x,y);y=246;gx();gy();void gx()extern int x,y;x=135;printf(“2:x=%dty=%dn”,x,y);int x,y;void gy()printf(“3:x=%dty=%dn”,x,y);,例 用extern扩展外部变量作用域,运行结果:1:x=0 y=02:x=135 y=2463:x=135 y=246,例 引用其它文件中的外部变量,例

10、引用其它文件中的变量,输出ab和a的m次方,7.9外部函数与内部函数,1外部函数 在定义函数时,如果冠以关键字extern,表示该函数是一个外部函数,如:extern void myfun(),与外部变量一样,当在其他程序文件中调用此函数之前,应该先用关键字extern说明该函数是一个外部函数,此说明可以放在调用它的函数体说明部分,也可以是在调用它的函数定义前面。,2内部函数 在定义函数时,如果冠以关键字static,表示该函数为一个内部函数,如:static void myfun()这样定义的函数myfun()的可视范围是定义它的程序文件,即该函数被限制为仅能被本身程序文件中的函数所调用,如

11、果在不同的文件中有同名的内部函数,它们互不干扰。,调用外部函数(其他源文件中定义的函数)时 函数说明语句 extern 函数名();,【例二】文件file1.c中main()int x=80,y=90,c;extern max();/*函数说明*/c=max(x,y)+20;/*调用max函数*/printf(“Max is%dn”,c);,文件files2.c中(与file1.c同目录)extern max(int a,int b)/*extern可省*/float c;c=ab?a:b;return c;,注:要做一个.prj文件才能运行。,7、10编译预处理,编译预处理:P185 宏定义

12、 文件包含 条件编译【编译】C编译系统对源程序进行:词法和语法分析,代码生成,优化.OBJ文件【编译预处理】编译前对源程序进行一些预加工(改善程序设计环境/模块化设计)编译预处理命令均以#开头,未尾不加分号可出现在程序的任何位置,其作用范围:出现点至所在源程序未尾。,1、宏定义 格式#define 宏名 宏体 宏名和宏体均为字符串,前者必须符合标识符命名规则。预处理时在程序中用宏体替换宏名。注意:可以用#undef 宏名 终止该宏名的作用范围。P185,定义符号常量,【例一】#define M 3#define N(M+1)#define NN N*N/2main()clrscr();prin

13、tf(NN=%d,NN);printf(5*NN=%dn,5*NN);,结果:NN=8,5*NN=40,【讨论】如果第二行改为:#define N M+1,结果:NN=6,5*NN=18,带参数的宏定义 格式#define 宏名(参数表)宏体,【例二】#define PI 3.14159#define s(r)PI*r*rmain()float a=1,sum;sum=s(a);printf(r=%.0f,s=%fn,a,sum);,结果:r=1,s=3.141590,带参数的宏定义,【例三】#define PT 5.5#define s(A)PT*A*Amain()int a=1,b=2;p

14、rintf(%4.1fn,s(a+b);,结果:9.5,【讨论】注意s(a+b)不是函数,它不做任何计算(如果是函数,则s(a+b)为s(3),结果49.5),s(a+b)=5.51212=9.5,带参数的宏定义,【例四】选择正确答案#include stdio.h#define SUM(y)1+ymain()int x=2;printf(%dn,SUM(5)*x);A)10 B)11 C)12 D)15,结果:B,2、文件包含 P185,#include 标准方式 只按标准方式(系统存放C库函数头文件所在目录)查找所要包含的文件 对TC,默认只在tcinclude目录下查找#include“

15、先在源文件所在目录找指定头文件,若无再按标准方式找(更保险),课堂提问:,1、如何判断一个变量是局部变量还是全局变量?2、定义一个变量时,如果没有规定存储类型,其默认的存储类型是什么?3、如果程序中有这样一个语句 static int x;出现在程序的不同位置其含义是否相同?其初值是多少?,课堂提问:,4、以下程序运行时出错提示为:undefined symbol x in function main 如何改正?程序:main()x=2;printf(“%dn”,x);int x;,法1:将int x;放到主函数之内法2:将int x;放到主函数之上法3:在主函数之内加一语句 extern i

16、nt x;法4:在主函数之上加一语句 extern int x;,课堂提问:,5、以下程序运行结果是。fun3(int x)static int a=3;a+=x;return a;main()int k=2,m=1,n;n=fun3(k);n=fun3(m);printf(%dn,n);,结果是 6,课堂提问:,6、以下程序运行结果是。#define SQR(x)x*xmain()int a=10,k=2,m=1;a/=SQR(k+m);printf(%dn,a);,结果是 2,课堂提问:,7、以下程序运行结果?main()int x;x=fun5(4);printf(%dn,x);,结果是 9,fun5(int n)int s;if(n=1)|(n=2)s=2;else s=n+fun5(n-1);return s;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号