C语言《变量作用域和预编译》.ppt_第1页
C语言《变量作用域和预编译》.ppt_第2页
C语言《变量作用域和预编译》.ppt_第3页
C语言《变量作用域和预编译》.ppt_第4页
C语言《变量作用域和预编译》.ppt_第5页
已阅读5页,还剩24页未读 继续免费阅读

VIP免费下载

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

文档简介

变量作用域和预编译,1,回顾:模块化程序设计,3. 递归函数的定义和用途,回顾:模块化程序设计,课程目标: 了解变量作用域的概念 掌握全局变量与局部变量的区别(重点) 掌握变量的存储类别(难点) 参考课本P168 P175 了解预编译的概念 掌握宏的概念及#define的使用(重点) 掌握文件包含及#include的使用 参考课本P230 P239,2,本次课内容,本次课内容,3,变量的使用范围与存储类型,3、变量的使用范围及其说明方法,4、变量的存储类别及其定义方法,一、 变量的使用范围与存储类型,4,变量的使用范围包括有 在一个函数内部使用的变量- 局部变量; 在 函 数 之 外部 使用的变量- 全局变量;,main() int a, b ; ,在一个函数内部定义的变量称为局部变量,局部变量,局部变量,1、局部变量,1.1 变量的使用范围:局部变量,5,1、主函数中定义的变量也只用在主函数中有效;,2、不同函数中可以使用相同的变量名,且它们代 表不同的存储单元,互不干扰;,3、形式参数也是局部变量。其它函数是不能调用 该形参的;,4、在一个函数内部,可以在复合语句中定义变量 ,这些变量只能在本复合语句中有效。,1.1.1 关于局部变量使用的几点说明,6,在函数内部(包括主函数)定义的变量,称为局部变量,其作用范围只在函数内部有效,如下代码,#include void fund1( void ) int nX= 100; /局部变量 printf(“nX in fund1=%dn”, nX); void fund2( void ) int nX = 200; /局部变量 printf(“nX in fund2=%dn”, nX); void main( void) int nX =50; /局部变量 printf( nX in main=%dn”, nX); fund1(); fund2(); ,程序代码,本例中定义了三个局部变量nX, 其作用范围分别作用于fund1,fund 和main函数 打印结果: nX in main=50 nX in fund1=100 nX in fund2=200,示例:局部变量,示例:局部变量,7,char c1,c2; int p=1,q=5; main() int a, b ; a=p; b=q; ,在函数之外定义的变量 称为 全局变量 全局变量可以为本文件中其它函数所共用。 它的使用范围: 从定义变量的位置开始到本源程序文件结束,全局变量,2、全局变量,1.2 变量的使用范围:全局变量,8,1、若在同一个源文件中,如有全局变量与局部 变量同名时,则在局部变量的作用范围内, 全局变量不起作用。,2、设置全局变量的作用是: 增加函数间数据联系的渠道。,由于同一个文件中的所有函数都能引用全局变量的值,因 此如果在一个函数中改变了全局变量的值,就能影响到其它函 数,相当于各个函数间有直接的传递通道。,关于全局变量使用的几点说明,1.2.1 关于全局变量使用的几点说明,9,举例,示例:全局变量,int d=1; main() int a=3; fun(a); d+=a+; printf(“%dn”, d); ,8,4,8,4,4,示例:全局变量,10,#include int nX = 999; /全局变量 void fund1( void ) printf(“nX in fund1=%dn”, nX); void fund2( void ) int nX = 0; /局部变量 printf(“nX in fund2=%dn”, nX); void main( void) printf( nX in main=%dn”, nX); fund1(); fund2(); ,程 序 代 码,在此范围中,局部变量nX的作用范围替代了全局变量nX的作用范围。,本例中函数fund2中的nX作用范围与全局变量nX有重叠部分,在重叠部分中使用局部变量,屏蔽掉了全局变量 打印结果: nX in main=999 nX in fund1=999 nX in fund2=0,变量作用范围重叠问题,1.2.2 变量作用范围重叠问题,11,数 据 区(动态),数 据 区(静态),内存存储区,程 序 区,用户区,在程序运行期间分配固定 的存储空间(如 全局变量)。,只有当函数被调用时才开始分配存储空间,在函数执行结束时就释放这些空间。在程序执行过程中,这种分配和释放是动态的(如 局部变量)。,内存存储区,内存存储区,12,在C语言中,每一个变量和函数有两个属性:数据类型和数据的存储类别。 数据类型,如整型、实型等; 存储类别,指的是数据在计算机中的存储方式, 也可以说数据的 存储地点。,内存 储 器 (memory),寄 存 器 (CPU),变量的存储类型,1.3、 变量的存储类型,13,关键词 auto,auto int b=1, c=2;,1、局部变量的存储方式:auto,1.3.1 局部变量的存储方式:auto,14,关键词 static,static int b=1, c=2;,2、局部变量的存储方式:static,1.3.2 局部变量的存储方式:static,参见源码:9_1 exp0901,15,int f( int a) auto int b=0; static int c=3; b=b+1;c=c+1; return(a+b+c); ,main() int a=2, i ; for(i=0; i 3; i +) printf(“%dn”, f(a); ,0,b,3,c,1,4,7,0,1,5,8,0,6,9,示例:局部变量的存储方式,示例:局部变量的存储方式,16,1、当需要保留函数上一次调用结束时的值; 2、如果初始化后,变量只被引用而不改变其值,则这时用静态局部变量比较方便,以每次调用时重新赋值。,main() int i; for(i=1;i=5;i+) printf(“%d!=%dn”, i, fac(i); ,1!=1 2!=2 3!=6 4!=24 5!=120,局部变量的用途,1.3.3 局部变量的用途,17,全局变量的扩展调用。 我们知道一个C 语言程序可以有一个或多个源程序 文件组成。如果程序是由多个源文件组成时,为了保障 某个全局变量能提供多个源文件中的函数调用,则可采 全局变量的扩展调用。,关键词 extern 只能用来定义全局变量,3、全局变量的扩展调用 extern,1.4 全局变量的扩展调用 extern,参见源码:9_1 exp0902,如果一个函数只能被它所在文件中的其他函数所调用,则称为内部函数或静态函数,如: Static int fun(int a,int b) 在多文件组成的程序中,如果在一个源程序文件中定义的函数,除了能在本程序内使用,还可以在其他源程序文件中使用.如: Extern int fun(int a,int b) 外部函数不用引用头文件.,18,内部函数和外部函数,1.4.1 内部函数和外部函数,参见源码:9_1 exp0903,19,但是,在有些情况下需要某些变量中的值频繁地读写(如某循环变量需要执行10000次循环,显然为了读写变量的值就需要花费许多的时间。因此,为了提高程序的执行效率,在C语言中允许将这些变量的值可以储存在CPU中的寄存器中,需要时可直接从寄存器中读出参加运算,而不必再到内存中去读写。由于寄存器的存取速度远高于内存的存取速度,因此可以提高执行效率。 这种变量称为 “寄存器变量” 。,关键词 register,register int a,b;,int fac(int n) register int i, f=1; for(i =1; i =n; i +) f=f* i ; return( f ); ,4、使用寄存器变量 register,1.5 使用寄存器变量 register,20,运算器,一般情况下,变量(包括静态和动态)的值都是存放在内存中的,当程序中用到哪一个变量的值时,则由控制器发出指令将内存中该变量的值送到运算器中进行运算,之后再将运算结果送回内存中存放。,内 存,寄存器存储区(了解),1.5.1 寄存器存储区(了解),21,1、只有 局部自动变量 和 形参 可以作为寄存器变量 。,5、局部静态 变量不能作为寄存器变量。,register static int a,b,c; 不能把变量 a,b,c 既放在静态存储区中,又放在寄存器中, 二者只能居其一。 对于一个变量只能定义为一个存储类别。,2、对于占用字节数多的变量,如: long、float、double 型变量 不能 说明为寄存器型变量。,3、由于寄存器中的数据可以直接访问,因此比其它存储类别的变 量运算速度要快。所以对于反复使用的变量均可作为寄存 器变量。,4、寄存器型变量都是在某个函数中定义的,所以一旦退出该函数后就会 被 释放。,1.5.2 寄存器变量使用的几点说明,22,自动型,auto,内存动态数据区,CPU 中的通用寄存器,内存静态数据区,静态型,寄存器型,扩展型,register,static,extern,内存静态数据区,存储类别标识符表,1.6 存储类别标识符表,23,预编译语句是在程序编译之前由编译器进行的源代码处理工作。 处理完成后的源代码再进入编译工作。 C+语言提供的预编译语句主要有以下三种:,宏定义 文件包含 条件编译,预编译指令均以“#”号标识,注意,预编译语句,二、 预编译语句,24,定义一般形式: #define 标识符 字符串 取消宏定义: #undef 标识符 作用:在预处理过程中将源程序中的标识符替换成字符串 例:,#include #define WM “Welcom” #define UINT unsigned int #define PI 3.14159 void main( void) printf( WM); UINT na = 100; UINT nb = 200; double dbA = PI * na * na; ,源 程 序 代 码,#include void main( void) printf( “Welcom”); unsigned int na = 100; unsigned int nb = 200; double dbA = 3.14159 * na * na; ,预 编 译 后 的 源 程 序 代 码,编译预处理,宏定义-#define指令,2.1 宏定义-#define指令,参见源码:exp0904exp0906,25,文件包含预处理控制有两种形式: #include /包含系统标准库文件 #include “filename” /包含自定义文件 作用:在预处理过程中用包含文件的内容取代#include命令. 例:,#include #include “test.h” void main( void) int na = nV; double dba = dbV; ,源 程 序 代 码,#include int nV = 10; double dbV = 0.5; void main( void) int na = nV; double db

温馨提示

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

评论

0/150

提交评论