第十、十一讲第6章函数、存储类和预处理程序b.ppt

上传人:本田雅阁 文档编号:2122311 上传时间:2019-02-19 格式:PPT 页数:48 大小:196.51KB
返回 下载 相关 举报
第十、十一讲第6章函数、存储类和预处理程序b.ppt_第1页
第1页 / 共48页
第十、十一讲第6章函数、存储类和预处理程序b.ppt_第2页
第2页 / 共48页
第十、十一讲第6章函数、存储类和预处理程序b.ppt_第3页
第3页 / 共48页
亲,该文档总共48页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第十、十一讲第6章函数、存储类和预处理程序b.ppt》由会员分享,可在线阅读,更多相关《第十、十一讲第6章函数、存储类和预处理程序b.ppt(48页珍藏版)》请在三一文库上搜索。

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;

2、printf(”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

8、b,c; /*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)变量 生命周期:整个程序的执行过程 有效范围:函数或文件内部 外部静态变量(静态全局变量) 内部静态变量(静态局部变量),【例6.12】求15的阶乘。 #include long factor(int n) static int f=1; f=f*n; return f; main() long i

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

11、egister 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 y) in

12、t 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 条件编译,预处理概述 符号 “#” 位置 源程序前面 功能 便于程序的阅读、修改、移植、调 试,和模块化程序设计,6.3.1文件包含 一、 概念 (1)文件包含的含义和功能 (2)文件包含的形式 #include “文件名”或 双引号或尖括号的区别: 用双引号:先在引用被包含文件的C源程序所在的

13、文件目录中寻找,若找不到,再按系统指定的标准方式寻找其它目录; 用尖括号:则仅查找按系统标准方式指定的目录。 通常采用双引号比较保险(自定义文件只能用“”)。,二 注意 *一个include命令只能指定一个文件 *被包含文件和所在文件成为一个文件注意 被包含文件中定义的全局变量 *文件包含可以嵌套,File1.c int min1(int a,int b) if(ab) return (b); else return (a); ,File2.c Int min2(int a,int b,intc) int z,m; Z=min1(a,b); M=min1(z,c); return (m); ,

14、#include #include “file1.c” #include “flie2.c” main() int x1,x2,x3,min; scanf(“%d,%d,%d”, ,6.3.2 宏替换 什么是宏?宏名?宏展开(宏替换)? #include #define PI 3.1416 main() float r; double p,s; scanf(“%f”, ,宏替换分为不带参数和带参数两种。宏替换的作用范围是定义它的源文件。 一、不带参数的宏替换 形式: #define 例如 #define PI 3.1416 #define M (y*y+3*y),说明: &宏名用大写字母 &使

15、用宏替换的作用 &宏扩展仅仅是简单的字符替换不检查语法 &宏定义后不加“ ;” &宏替换的范围 &宏定义中可以引用以定义的宏名 &宏替换不替换双引号括起来的字符串,二、带参数的宏替换 形式 #define (宏名)(形参表) (字符串) 例 #define square(x) x*x 则,square(5)将被替换为5*5. 思考:square (a + b) =? 若 #define square(x) (x) * (x) square (a + b) =?,例 #define MAX(a,b) (ab)?a:b main() int m,n,max; printf(“input two n

16、umbers: ”); scanf(“%d%d”, ,说明: 宏名和形参表间不能出现空格 思考:#define MAX (a,b) (ab)?a:b printf(“max=%dn”,max); 宏形参的数据类型(和函数的区间) 宏定义中的形参只是标识符,而宏调用中的形参可以是表达式 宏定义中字符串中的形参般都用括号括起来,思考 #define SQ(y) y*y sq=SQ(a+1) sq=160/SQ(a+1) sq得到什么结果?,函数和带参数的宏比较,函数值传递 宏仅为字符的替换 函数调用时给形参分配空间,而宏调用在预编译时完成不分配空间 函数中形参的类型要定义,宏形参不定义类型 函数调

17、用占有程序运行时间,而宏调用占编译时间,6.3.3 条件编译 是对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件。 条件编译指令有以下三种形式: (1)# ifdef # else #endif,功能:当“标识符”已经被 #define命令定义过,则 编译程序段1,否则编译 程序段2。,(2)#ifndef # else #endif (3)# if #else #endif,格式与#ifdef #endif命令一样, 功能正好与之相反。,当表达式为非0(“逻辑真”) 时,编译程序段1,否则编译 程序段2。,数值转换 #include “stdio.h“ void

18、main() int m,n,k,a5,i=0,j=0; a5=(0,0,0,0,0,0); char t; printf(“shurushuju:“); scanf(“%d“, ,for(i=j-1;i=0;i-) if(ai9) printf(“%c“,ai); else printf(“%d“,ai); ,用函数求因子,#include “stdio.h“ void yinzi(int); main() int m; printf(“shurushuju: “); scanf(“%d“, ,void yinzi(int m) int n; for(n=1;nm;n+) if (m%n=0) printf(“%4d“,n); ,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1