第6章 函数、存储类和预处理程序b.ppt_第1页
已阅读1页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

1、6.2.1 问题的提出,6.2.2 auto变量,6.2 变量的作用域与生命期,6.2.3 extem变量,6.2.4 static变量,6.2.5 register变量,6.2.6 存储类别小结,第,章,6,函数、存储类和预处理程序,【例6.10】i的输出值是多少? #include void f( ) int i; i=3; main() int i=0; f(); i+=5; printf(”i=%d”,i); ,6.2.1 问题的提出,【例6.10】i的输出值是多少? #include void f( ) int i; i=3; main() int i=0; f(); i+=5; p

2、rintf(”i=%d”,i); ,6.2.1 问题的提出,考虑两个问题: (1)函数f中语句i=3;中的i与main中的i是同一个变量? (2)函数调用结束后f中的i值依然存在?,这两个条件均不成立, i的值为5,概述,C语言说明变量是给出两方面信息: 数据类型和存储类别。数据类型,是变量的操作属性。存储属性反映了变量的如下一些特性: (1)变量的存储器类型 程序中的变量是存储在内存储器中的。实际上,除主存与辅存外,CPU中还有一个小小的临时存储器称为寄存器,用以存储一些反复被加工的数据,寄存器的存取速度比主存快。,C语言允许程序员区分是在主存(主存的数据区分两个部分:静态存储区和动态存储区

3、)中还是在寄存器中开辟变量存储空间。,(2)变量的生命期:变量占据内存的时间期限. 静态变量:静态变量存储空间在程序的整个运行期间是固定的。一个变量被指定为静态,在编译时分配存储空间,程序一开始执行便被建立,直到该程序执行结束都是存在的。 动态变量:动态变量是在程序执行当中被动态建立、动态撤销的,仅存在于函数被调用期间。,(3)变量的作用域:变量出现的有效区域 局部变量:局部范围内有效 全局变量:从定义的位置开始到本文件的结束.,变量的存储类别决定了变量的作用域和生命期,变量的存储类别共有四种: 自动型(auto) 外部型(extern) 静态型(static) 寄存器型(register)

4、自动变量和寄存器变量属于动态存储方式,外部变量和静态内部变量属于静态存储方式。,1.自动型(auto)变量是变量被说明时,存储类信息缺省的,并且变量的说明出现在函数内部,这样的变量的存储类别就是自动型。 int f(int a) auto int b,c; float d,e; : : ,复合语句(Block)也可出现变量说明,当缺省存储类别信息时,就属于自动型变量。 main() int a,b,c; : float d,e; /*存储类别是隐式说明, 即存储类别是自动型*/ : : ,自动型变量一旦说明只能在说明该变量的函数或复合语句中出现才算有效。离开了上述区域,对该变量的引用是无效的,

5、不合法的。 double fun1(double p1) int p2,p3; : p1,p2,p3的有效区域 : Char fun2 (char p4) char p5,p6; : p4,p5,p6的有效区域 : ,形参(自动型),main() float x,y; : : int a,b; : a,b的有效区域 : x,y的有效区域 : : ,内部变量和外部变量 变量说明的位置不同,其作用域也不同,据此将语言中的变量分为内部变量和外部变量。,内部变量:在一个函数内部说明的变量是内部变量,它只在该函数范围内有效。也就是说,只有在包含变量说明的函数内部,才能使用被说明的变量,在此函数之外就不能

6、使用这些变量了。所以内部变量也称“局部变量”。,例如: int f1(int a) /*函数f1*/ int b,c; /*a,b,c作用域:仅限于函数f1()中*/ int f2(int x) /*函数f2*/ int y,z; /*x,y,z作用域:仅限于函数f2()中*/ main() int m,n; /*m,n作用域:仅限于函数main()中*/,关于局部变量的作用域还要说明以下几点: 1主函数main()中定义的内部变量,也只能在主函数中使用,其它函数不能使用。同时,主函数中也不能使用其它函数中定义的内部变量。因为主函数也是一个函数,与其它函数是平行关系。这一点是与其它语言不同的,

7、应予以注意。,2形参变量也是内部变量,属于被调用函数。 3允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。 4在复合语句中也可定义变量,其作用域只在复合语句范围内。,2. 外部(extern)变量是指,在一个函数中合法出现的同时,又可以在其它函数中合法出现。,int a,b; void f( ) a+=2; b+=3; : : main( ) a=1; b=2; : : f( ); : : ,/*a,b是外部变量 */,它们既可以在函数f 中合法出现,又可以 在函数main中合法出现。,外部变量的说明也可出现在函数的内部,例如: int b,c

8、; /*b,c是外部变量 */ int f(int a) extern int d,e; /*d,e是外部变量 */ d=e=3; : : int d,e; main( ) : : ,如果定义点之前的函数需要引用这些外 部变量时,需要在函数内对被引用的外部变 量进行说明。(不带存储类别的外部变量说 明称为变量的定义性说明,带存储类别的外 部变量说明称为变量的引用性说明) 外部变量引用性说明的一般形式为: extern 数据类型 外部变量,外部变量2; extern int d,e;,注意:外部变量的定义性说明和外部变量的引用性说明是两回事。外部变量的定义性说明必须在所有的函数之外,且只能定义一

9、次。而外部变量的引用性说明,出现在要使用该外部变量的函数内,而且可以出现多次。,外部变量的作用域是从其出现的位置直至程序正文结束。 extern变量的生命期是整个程序执行期。 外部变量作用是为了在函数与函数之间,文件与文件之间进行通信,即外部变量起“全局变量”的作用。,3.静态(static)变量是一种特殊的变量,其生命周期是整个程序的执行过程,即当结束了相应函数调用后,static变量的存储空间依然保留。,【例6.12】求15的阶乘。 #include long factor(int n) static int f=1; f=f*n; return f; main() long i; for

10、 (i=1;i=5;i+) printf(%dn,factor(i); ,说明: 静态变量可出现在程序正文的任何位置,必须用static显式地加以说明。它既可出现在函数内部,又可以出现在函数外部。 函数内部的静态变量初始化语句只有在第一次调用该函数时才执行。 函数内部的静态变量的作用域仅局限于该函数内。函数内部的静态变量的生命期是整个程序的执行过程。 静态变量有和外部变量一样的生命期,但要改变该变量的值,必须在函数内部完成。,4.寄存器(register)变量只能出现在函数内部,必须用关键词register。 【例6.13】 寄存器变量实例。 #include long factor (int

11、 n ) register int i; long r; for (i=1,r=1;i=n;i+) r*=i; main() : : ,一般情况下,变量的值都是存储在内存中的。 为提高执行效率,语言允许将局部变量的 值存放到寄存器中,这种变量就称为寄存器 变量。 (1)只有局部变量才能定义成寄存器变量,即全局变量不行。 (2)对寄存器变量的实际处理,随系统而异。例如,微机上的MSC和TC将寄存器变 量实际当作自动变量处理。 (3)允许使用的寄存器数目是有限的,不能定义任意多个寄存器变量。,【例6.14】写出下列程序的输出结果。 #include int x=1,y=2; f(int x,int

12、 y) int z=2; z=x+y; return z; main() int x=3,w; w=f(x,y); printf(”%d”,w); ,在同一个源程序中若全程 变量与自动变量同名,则 在自动变量的作用域内, 全程变量不起作用。,6.3.1 文件包含,6.3.2 宏替换,6.3 预处理程序,6.3.3 条件编译,文件包含形式: #include “文件名” 或为:#include 双引号或尖括号的区别: 用双引号:则系统先在引用被包含文件的C源程序所在的文件目录中寻找,若找不到,再按系统指定的标准方式寻找其它目录; 用尖括号:则仅查找按系统标准方式指定的目录。,宏替换又称宏定义,分

13、为不带参数和带参数两种。 不带参数宏定义的一般形式为: #define 宏替换的作用范围是定义它的源文件。 # define Pi 3.1416 #define z x * y,#include #define Pi 3.1416 main() float r; double p,s; scanf(“%f”, ,带参数的宏定义的一般形式是 #define #define square(x) x*x 则,square(5)将被替换为5*5. 若出现square (a + b)则被替换成a + b * a + b,显然,若要求结果为(a + b)* (b + a), 可用以下方法: #define square(x) (x) * (x) 一般地,宏定义指令中出现的参数在中均用圆括号括起。,条件编译:是对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内

温馨提示

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

评论

0/150

提交评论