清华教程第四讲程序结构_第1页
清华教程第四讲程序结构_第2页
清华教程第四讲程序结构_第3页
清华教程第四讲程序结构_第4页
清华教程第四讲程序结构_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

1、第四讲 程序结构变量内部函数与外部函数编译预处理变量从变量的作用域可以分为局部变量和全局变量;从变量的存储形式可以分为动态存储变量和静态存储变量。局部变量全局变量动态存储变量静态存储变量局部变量局部变量也称内部变量,它是在函数内部定义的,只在该函数内部有效(包括main函数)。在该函数以外不能使用。这就使得不同函数之间可以使用相同的变量名,它们代表不同的对象,互不干扰。当局部变量在复合语句中定义时,该变量只在该复合语句中有效。例如:if(ab)int i;i=a;变量i只在复合语句中有效。区别:for(int i=0;i10;i+)变量i在for语句之后有效。全局变量一个源文件可以包含若干个函

2、数,全局变量是在源文件中而在函数之外定义的,也叫外部变量。全局变量可以为本文件中其它函数所共用,它的作用范围是从变量定义的位置开始到源文件结束。下面以三个例子说明外部变量的使用。 #include int f1(int x);int c1=30;int c2=40; main()int x=0;c2+;x=f1(x)+c1+c2;coutx=xendl;return 0;int p1=1;int p2=2;int f1(int x)int z;c1+;z=x+p1+p2+c1+c2;return z;例(1)外部变量增加了函数间联系的渠道,如果一个函数改变了全局变量的值就能直接影响到其它函数。

3、#include int max(int x,int y);main()extern int a,b;coutmax(a,b)=“max(a,b)y? x:y;return z; 如果在外部变量定义之前的某个函数相引用外部变量,应函数体内加以说明。例(2)例(3)#include int i=100;int max(int x,int y);main()couti=i0)int i=0;couti=iendl;couti=iendl;return 0; 如果在同一源文件中,外部变量与局部变量同名,则在局部变量的作用域内,外部变量被局部变量所屏蔽。建议不在必要时不要使用全局变量,因为全局变量在程

4、序的整个执行过程中都占用内存空间,而且使程序的通用性和可移植性降低。全局变量过多还会降低程序的清晰性。 动态存储变量动态存储方式是在程序运行期间根据程序运行的需要动态的分配存储空间的方式。(1)函数形参变量。(2)未加static说明的局部变量。其关键字是auto,经常省略。(3)函数调用时的现场保护和返回地址等。这些变量在程序执行期间动态地分配存储空间。 动态存储区中存储的数据有静态存储变量静态存储方式是在程序执行期间一直占有固定的存储空间的方式。主要有两种:(1)局部静态变量(2)全局变量局部静态变量局部静态变量存储于静态存储区,在编译时赋初值,程序运行期间不赋初值,而是保留上一次函数调用

5、结束时的值,在整个程序运行期间都占有空间。程序运行结束时释放空间。#include void fn()int a=0;static n=0;a+;n+;cout第n次调用函数f时,a=a n=nendl;main()for(int i=0;i5;i+)fn();return 0;例如:当需要保留函数上一次调用结束的值或初始化后,变量只被引用而不被改变的情况下一般用局部静态变量。运行结果为:第1次调用函数f时,a=1,n=1第2次调用函数f时,a=1,n=2第3次调用函数f时,a=1,n=3第4次调用函数f时,a=1,n=4第5次调用函数f时,a=1,n=5全局变量全局变量存放在静态存储区,在程

6、序开始执行时分配存储单元,整个程序运行期间都占据固定的存储单元,程序执行完毕释放。在一个源文件中使用全局变量的情况已经介绍过了,这里主要讨论在不同源文件之间使用全局变量的情况。f1.cpp:int a;/变量定义main()f2.cpp:extern int a;/变量引用/extern int a=10;/变量定义int f() 情况1 允许被其它文件引用情况2 不允许被其他文件引用f1.cpp:static int atype fn()内部函数和外部函数如果一个函数只能被本文件中的其它函数所调用,称为内部函数,又称静态函数,在函数定义时加static关键字。定义函数时在前面加一关键字ext

7、ern,表示此函数是外部函数,可以被其它文件中的函数调用, extern可省略f1.cpp:#include extern void enters(char s);extern void deletes(char s,char c);extern void prints(char s);void main()char c;static char str80;enters(str);cinc;deletes(str,c);prints(str); 外部函数f2.cpp:void enters(char str) f3.cpp:void deletes(char str,char ch)f4.cp

8、p:void prints(char str)在编译时,先分别对四个文件进行编译,得到4个OBJ文件(目标文件),在把OBJ文件连接起来生成一个可执行文件。 在编译时,先分别对四个文件进行编译,得到4个OBJ文件(目标文件),在把OBJ文件连接起来生成一个可执行文件。 内部函数内部函数不允许被其他文件所引用:static type fn()编译预处理宏定义文件包含处理条件编译宏定义宏定义的一般形式是#define 标识符 字符串#include#define PI 3.1415926void main( )float p,s;int r=2;p=2*PI*r;s=PI*r*r;cout半径为r

9、的圆周长是p,面积是sendl;例如:宏定义是用宏名代替一个字符串,只作简单置换,不作语法检查。宏定义不是C语句,在末尾不加分号宏名习惯用大写字母表示宏定义时可以引用已经定义的宏名,层层替换。#define PI 3.1415926#define R 2#define S PI*R*R#define P 2*PI*R 宏定义的有效位置一般从宏定义开始到文件的结束,也可以用#undef命令结束宏定义。#define PI 3.1415926main()#undef PIf()带参数的宏定义宏定义也可以带参数,这时不仅要进行宏名的替换,还要进行参数的替换。#define 宏名(参数表) 字符串 #

10、include#define max(a,b) ab?a:bvoid main()int n1=3,n2=5;int z1,z2;z1=max(n1,n2);z2=max(9,6);coutz1=z1endl;coutz2=z2v2?n1:n296?9:6思考:下列程序的运行结果#include #define ADD(x,y) x+ymain()int z=0;coutz=2*ADD(10,20)endl;return 0;运行结果:z=402*10+20文件包含说明:(1)一个include命令只能指定一个被包含文件。 (2)如果文件1包含文件2,而文件2 用到文件3,可以在文件1中写入以

11、下代码: #include”file3.h”#include”file2.h” (3)#include命令中若文件名用“”括起来,则系统先在引用被包含文件的源文件所在目录中查找,再按系统指定的标准方式检索其它目录。若文件名用括起来,系统不检查源文件所在目录,而是直接按系统标准方式检索文件目录。 (4)被包含文件与其所在文件在预编译后成为一个文件,全局变量与静态变量在整个文件中有效。 条件编译条件编译是对源程序中的一部分内容在满足一定条件时进行编译,这样做可以减少被编译的语句,减小目标程序的长度。条件编译命令有三种形式:1、#ifdef 标识符程序段1#else程序段2#endif 2、#ifndef 标识符程序段1#else 程序段2#endif3、#if 表达式程序段1#else 程序段2#endif#include

温馨提示

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

评论

0/150

提交评论