[IT认证]第6章 编译预处理与变量的作用域_第1页
[IT认证]第6章 编译预处理与变量的作用域_第2页
[IT认证]第6章 编译预处理与变量的作用域_第3页
[IT认证]第6章 编译预处理与变量的作用域_第4页
[IT认证]第6章 编译预处理与变量的作用域_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

1、第六章编译预处理与变量作用域编译预处理与变量作用域雷艳静雷艳静qq: 427727621基本内容编译预处理编译预处理变量的作用域与可见性变量的作用域与可见性变量的存储类型变量的存储类型6.16.26.326.1 编译预处理3n编译预处理l指c在编译源程序之前,对源程序进行的预处理;n类型l文件包含l宏定义n注意事项l必须以 # 为首字符,尾部不必加分号;l一行最多写一条编译预处理命令;l编译预处理命令可以出现在源程序任意位置。其作用范围从其出现位置到所在源程序的末尾。6.1.1 文件包含4n一般格式l# include l# include “包含文件名”n功能l编译源程序前,用包含文件的内容

2、置换该预处理命令。l例:# include n两种形式的区别l用尖括号包含文件时,编译系统将按照系统设定的标准标准目录目录搜索该文件;l用双括号包含文件时,编译系统将首先在当前目录当前目录中查找该文件,再按标准目录查找该文件。6.1.1 文件包含5nc语言中系统提供的包含文件都以 .h 为后缀。n常用的包含文件 (函数库)lctype.h:字符处理函数库lmath.h:数学函数库lstdio.h:标准输入/输出函数库lstdlib.h:常用函数库lstring.h:字符串处理函数n其它文件l编制由多个源程序文件组成的较大程序时,可以用文件包含命令,将一个源文件的文本插入到另一个文件。6.1.1

3、 文件包含6例6-1:一个程序写在多个源文件中,用 # include 连接。6.1.2 宏定义7n格式与功能l# define 宏名 宏体l宏名为标识符,宏体为一段文本。n功能l在预处理时,将程序中该命令后所有与宏名相同的文本用宏体置换(宏替换)。n举例l# define eof -1l# define null 06.1.2 宏定义8n宏定义和宏替换的基本规则l宏体文本太长,换行时,需要在行尾加字符“”;# define prn printf(“hello”); printf(“kitty!n”);l宏体中,可以出现已定义(在该命令前)的宏名;# define cr printf(“n”)

4、# define cr2 cr; crl对出现在字符串常量中的宏名不作宏替换;l为了和程序中的关键字相区别,一般宏名用大写字母。6.1.2 宏定义9 例6-2:分别输出a1, a2, a3, a4, a5和b1, b2, b3, b4中的最大值以及它们的乘积。# include # define cr printf(“n”)# define cr2 cr; cr# define find_max scanf(“%f”, &max); for (i=2; imax) max=x; void main() float y1, y2, max, x; int i, n; n=5; find_max;

5、 y1=max; n=4; find_max; y2=max; printf(“%f”, y1); cr; printf(“%f”, y2); cr2; printf(“cr%f”, y1*y2); cr;输入: 3.1 4.5 6.3 1.2 -5 1.1 3.2 2.13 -1.26.1.2 宏定义10n带参数的宏l格式: # define 宏名( 形参列表 ) 宏体l功能:在编译预处理时,将程序中、该命令后所有与宏名相同的文本用宏体置换;置换时宏体中的形参要用相应的实参代替。6.1.2 宏定义11 例6-3:输入3个值,判断以这3个值作为边长,能否构成三角形。# include # de

6、fine f(a, b, c) a+b=cvoid main() float x, y, z; scanf(“%f%f%f”, &x, &y, &z); if ( f(x,y,z) & f(x, z, y) & (y, z, x) printf(“yesn”); else printf(“non”);6.1.2 宏定义12n带参数宏与函数的区别l带参宏中所谓的“形参列表”,其实是“标识符列表”,没有变量变量的含义的含义。而函数形参是具体的变量。l函数调用时,先求出实参表达式的值,然后代入形参。而带参的宏只是进行简单的字符替换只是进行简单的字符替换,不存在实参与形参之间值传递的问题。l函数调用是

7、在程序运行时程序运行时处理的,为形参分配临时的内存单元。而宏展开则是在编译前进行编译前进行的,展开时并不分配内存单元,不进行值的传递,也没有“返回值”的概念。l函数要求实参和形参都要定义类型,且类型一致。而宏不存在类型的问题,它的参数只是一个符号代表。l宏替换不占运行时间,只占编译时间。而函数调用则占运行时间(分配单元、保留现场、值传递和返回等)。6.1.2 宏定义13 例6-4:写出下列程序的输出结果。# include # define f(a, b) a*bvoid main() float x=2, y=3, z; z=f(x, y); printf(“%ft”, z); z=f(x+

8、5, y-2); z=f(x*x+2*x-5, y+3);# include # define f(a, b) (a)*(b)# define g(a, b) (a)-(b)void main() float x=2, y=3, z; z=f(x*x+2*x-5, y+3); z=g(x+5, y-2);6.1.2 宏定义14n宏定义的优缺点l缺点:宏替换时,要用宏体替换宏名,往往使源程序体积膨胀,增加了系统的存储开销。故一般情况下,宏只能用来实现简单的函数功能。l优点:不像函数调用那样,需要进行参数传递、保存现场、返回等操作,所以比函数调用节省时间。使用宏,可提高程序的通用性,便于修改和维护

9、。例如:# define pi 3.146.2 变量的作用域与可见性15n变量的作用域l定义c程序中的变量能够被使用的范围称为其作用域。l分类块作用域函数作用域文件作用域局部变量全局变量6.2.1 变量的作用域16(1) 块作用域块作用域l声明位置在复合语句或结构内部(块)声明的变量具有块作用域。l作用域始于声明处,终止于块结束处,且存储单元被系统回收。# include void main() int i, s=0; int i; for(i=1; i=10; i+) s=s+i; printf(“s=%d, i=%dn”, s, i);for (int i=1; i=10; i+) s=s

10、+i;/* 循环体结束后存储单元释放 */6.2.1 变量的作用域17(2) 函数作用域函数作用域l声明位置在函数内部、块的外部声明的变量具有函数作用域。l作用域始于声明处,终止于函数结束处,且存储单元被系统回收。# include void main() int i, s=0; int i; for(i=1; i=10; i+) s=s+i; printf(“s=%d, i=%dn”, s, i);由函数的作用域可知:同一程序的不同函数中,变量即使同名也不是同一个变量,因为它们的地址空间不同,分别作用于各自的函数。6.2.1 变量的作用域18(3) 文件作用域文件作用域l声明位置在函数外部声

11、明。又称外部变量,或全局变量。l作用域从该变量声明处开始,直到文件末尾。6.2.1 变量的作用域19例6-6:输入长方体的长、宽、高,求其体积及正、侧、顶3个面的面积。# include float s1, s2, s3;float vs(float a, float b, float c) float v; v=a*b*c; s1=a*b; s2=b*c; s3=a*c; return v;void main() float v, l, w, h; printf(“input length, width and height:”); scanf(“%d%d%d”, &l, &w, &h);

12、v=vs(l, w, h); printf(“v=%f, s1=%f, s2=%f, s3=%fn”, v, s1, s2, s3);6.2.2 变量的可见性20l变量的作用域 指变量能够被使用的范围。l变量的可见性变量的可见性指在某个范围内是否可引用该变量。6.2.2 变量的可见性21l变量可见性总结(1) 具有块作用域的变量只有在块内可见。# include void main() int i, s=0; int i; for(i=1; i=10; i+) s=s+i; printf(“s=%d, i=%dn”, s, i);6.2.2 变量的可见性22(2) 具有函数作用域的变量只有在函

13、数内可见。# include int f1(int), f2(int);void main() int i, x; printf(“%d, %dn”, f1(10), f2(10); int f1(int n) x=0; for (i=1; i=n; i+) x=x+i; return x; /* ? */int f2(int n) x=1; for (i=1; i=n; i+) x=x*i; return x; /* ? */6.2.2 变量的可见性23特别注意:变量的作用域和可见性并非完全等价并非完全等价。例:函数内部声明了具有函数作用域的变量i, 如果函数内部的某语句块中声明了同名的变量

14、i, 在块内只有块局部变量可见。# include void main() int i=3; printf(“i=%dn”, i); int i=1; printf(“i=%dn”, i); i+; printf(“i=%dn”, i);函数局部变量i的作用域函数局部变量i不可见,只有块局部变量i可见6.2.2 变量的可见性24(3) 函数内部声明了与全局变量同名的变量,则全局变量在函数内部不可见。即全局变量被“屏蔽”。# include char int i=3;void p1() printf(“i=%dn”,i); void main() int i=5; printf(“i=%dn”,

15、i); p1(); i=i+2; printf(“i=%dn”, i); i=5 - in main() i=3 - in p1() i=7 - in main()6.2.2 变量的可见性25(4) 全局变量在其声明位置之前不可见,使用extern语句可改变其作用域。# include void main() printf(“a=%d, b=%dn”, a, b);int a=13, b=-8;extern int a, b;用extern改变变量作用域时,其类型名可省略。6.2.2 变量的可见性26程序#includeint a; /全局变量全局变量void main() void fun(

16、); fun(); printf(%d, a); void fun() a=9*9; 程序运行:81程序#includevoid main() void fun(); fun(); printf(%d“, a); int a; /全局变量全局变量void fun() a=9*9; 有语法错误程序#includevoid main() extern int a; void fun(); fun(); printf(“%d”, a); int a; /全局变量全局变量 void fun() a=9*9; 程序运行:816.3 变量的存储类型27l变量的两种属性数据类型:表示存储在变量中数据的格式;

17、存储类别:表示系统为变量分配存储空间的方式。p声明变量的一般格式:存储类型标识符存储类型标识符 类型标识符类型标识符 变量名列表;变量名列表;l存储类别auto自动类型register寄存器类型static静态类型extern外部类型程序存储区静态存储区动态存储区用户内存空间的分配6.3 变量的存储类型28(1) auto自动类型函数内部定义的局部变量、块变量、形参等都属于auto存储类别;特点:系统调用该函数时会给它们分配存储空间,调用结束时自动释放这些存储空间。因此又称为自动变量。auto型变量存储在动态存储区。auto为缺省存储类别。如果不写,则缺省为auto类别。程序存储区静态存储区动

18、态存储区用户内存空间的分配6.3 变量的存储类型29(2) register 寄存器型 一般情况下,变量存放在内存中。当程序用到哪个变量时,就从内存中将此变量送到cpu进行运算;运算完毕若需要存数,则再从cpu将数据送到内存存放。cpureg取数存数内存 对于一些频繁使用的局部变量,可将其存在cpu内部的寄存器中,需要时可直接取出参与运算,而不必到内存中取。由于访问寄存器的速度远远大于访问内存的速度,因此可大大提高执行效率。6.3 变量的存储类型30(2) register 寄存器型 register long i;for (i=1; i=1000000; i+) register 型变量存在

19、动态存储区。只有局部自动变量和形参可以作为寄存器变量。一个计算机系统的寄存器数目是有限的,不能定义任意多个寄存器变量。当今的优化编译系统能够识别使用频繁的变量,从而自动将这些变量放在寄存器中,而不需程序设计者指定。6.3 变量的存储类型31(3) static 静态型函数内定义的auto型变量,会随着函数调用的结束而消失。如果希望再次调用该函数时再次调用该函数时,这些变量仍能保持原来的值,应将这些变量声明为static类型。static型变量存储在静态存储区。该类数据在程序执行在程序执行前被分配存储空间前被分配存储空间,无论static在哪一个函数中声明,在程序运行的整个过程中,该存储空间总是被占用。static型变量只在最开始时赋一次值,以后使用时,均使用其里面已保存的值。 6.3 变量的存储类型32例:编程,输入m和n,分别计算 1m 和 1n 的和。# include int sum(int k) static int y=0; for (int i=1; i=k; i+)

温馨提示

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

最新文档

评论

0/150

提交评论