第6章程序结构PPT讲稿.ppt

上传人:石*** 文档编号:49902469 上传时间:2022-10-12 格式:PPT 页数:33 大小:1.76MB
返回 下载 相关 举报
第6章程序结构PPT讲稿.ppt_第1页
第1页 / 共33页
第6章程序结构PPT讲稿.ppt_第2页
第2页 / 共33页
点击查看更多>>
资源描述

《第6章程序结构PPT讲稿.ppt》由会员分享,可在线阅读,更多相关《第6章程序结构PPT讲稿.ppt(33页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第6章程序结构第1页,共33页,编辑于2022年,星期一第一节 变量的存储类型C/C+语言中的变量都有两个属性:数据类型和存储类别。数据类型在第2章已经详细讨论过,本节将讨论变量的存储类别。C/C+语言中定义了4个关键字作为变量的存储类别的修饰词,分别为:auto(自动)、static(静态)、register(寄存器)和extern(外部)。变量的存储类别决定了变量在内存中的存储区域。第2页,共33页,编辑于2022年,星期一内存存储区(第5章)代码区:程序代码全局数据区:全局和静态数据堆区:动态数据栈区:函数中形参和局部数据第3页,共33页,编辑于2022年,星期一内存分配方式C/C+内存

2、分配方式有三种:自动分配、静态分配和动态分配。自动分配:程序运行后,系统为程序开辟一块称为栈的活动存储区。在栈中为变量临时分配空间。程序运行后,在变量作用域开始时由系统自动分配内存,在作用域结束后即释放内存。静态分配:系统为每个程序开辟一个固定的静态存储区。程序开始执行时变量就占用内存,直到程序结束时变量才释放内存。动态分配:称为堆的内存,处于栈和静态存储区之外的自由存储单元。完全由程序自身控制内存分配和释放。第4页,共33页,编辑于2022年,星期一变量的存储类型声明及存储区域在声明变量时可以制定变量的存储类型,形式如下:存储类型存储类型 数据类型数据类型 变量名列表;变量名列表;如:aut

3、o inr a;static float b,c;变量的4种存储区域:auto栈,内部变量隐含类型 register寄存器 extern 静态存贮区,外部变量隐含类型 static 静态存贮区第5页,共33页,编辑于2022年,星期一auto变量所有的局部变量的声明中如果不含存储类别,那么都默认为auto型变量。如下函数中的两种声明方式是等效的。/*声明方式1*/int fun(auto int arg1,auto double arg2)auto int a=1;auto int b=1;/*声明方式1*/int fun(int arg1,double arg2)int a=1;int b=

4、1;第6页,共33页,编辑于2022年,星期一计算机对变量的操作所有变量的值都是存储在内存中的,而计算机的直接操作对象是寄存器。寄存器是CPU内部的元件,寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。当程序访问变量时,计算机要先从内存中将变量值提取到寄存器中。运算结束后,如果该变量值发生改变,则还需要把寄存器中的值重新送回到内存存放。第7页,共33页,编辑于2022年,星期一register变量C/C+语言中提供了一种存储类别register,这种存储类别的变量的值会被要求直接存储在寄存器中。访问该变量无需从内存中获取它的值,存储该变量时也无需再存回内存,都直接在寄存器上进行操

5、作。由于寄存器的存取速度要远快于内存的存取数度,因此,如果一个该变量在程序中被频繁使用,那么将其声明为register变量,将大大提高程序的执行效率。register型的变量声明如下所示:register 数据类型名数据类型名 变量名变量名;register变量的使用要注意:register只能修饰函数内的变量,包括局部变量和形式参数;一个变量只能声明为一种存储类别;也不能进行取地址操作。第8页,共33页,编辑于2022年,星期一extern变量关键字extern用于声明全局变量时,可以扩展全局变量的作用域。除此之外,extern还可以使全局变量的作用域扩展到其他文件中。外部变量有定义性声明和

6、引用性声明两种声明方式。定义性声明表示定义变量,要为变量分配内存空间;引用性声明说明该变量已在程序源文件中的其他地方进行过定义性声明。外部变量的定义性声明只能放在函数的外部,引用性声明可放在函数外部,也可放在函数内部。如:extern int b;/引用性声明,也可以放在函数内部void fun()coutb;extern int b=5;/定义性声明,可以省略extren.第9页,共33页,编辑于2022年,星期一extern变量的作用当一个程序含有多个源文件时,在一个源文件中定义了一个全局变量后,其他源文件就不能再定义同一变量名的全局变量(但可以定义static全局变量),否则会导致变量重

7、复定义的错误。此时,如果在其他源文件中要用到这个全局变量,就必须使用extern声明语句,以扩展extern在文件间的作用域。例如,一个程序有两个文件file1.cpp和file2.cpp。file1.cpp中定义了变量a,而在file2.cpp中要用到该变量,只需在使用之前用extern声明变量a。程序自己会去寻找。/file1.cpp int a=1;/file2.cpp extern a;int main()couta=a;第10页,共33页,编辑于2022年,星期一静态全局变量在第五章已经介绍过了static静态局部变量。在全局变量前加一个static,就使该变量为静态全局变量,该变量

8、值在这个源文件中可以用。在所有程序都由一个源文件实现的方法中,全局变量和静态全局变量是没有区别的。在多文件组成的程序中,全局变量和静态全局变量是不同的。静态全局变量使得该变量成为定义该变量的源文件所独享。对于组成该程序的其他源文件是无效的。第11页,共33页,编辑于2022年,星期一静态函数函数声明和定义在默认的情况下,在整个程序中是extern的。有时候可能需要时某个函数只在一个源文件中有效,不能被其他源文件所有,这时在函数情面可以加上static。第12页,共33页,编辑于2022年,星期一第二节 作用域和生存期变量的作用域:作用域:从代码空间角度,变量在程序中有效的范围。变量的生存期:生

9、存期:从时间角度来看,指在程序执行过程中变量从创建到被撤销的一段时间,它确定变量是否存在。生存期与作用域密切相关。C+程序中的变量有两种属性:数据类型、存储类型(auto,register,extern,static)。其中存储类型决定了变量的作用域和生存期第13页,共33页,编辑于2022年,星期一作用域和生存期通过归纳C/C+的变量有3种作用域:1、局部作用域局部变量(内部变量)。2、全局作用域全局变量可以在其他相链接的 源文件使用但要加extern。3、文件作用域全局变量在当前文件范围内使用,必须时加上static。作用域和生存期的区别:作用域变量在源程序中的静态区域。生存期变量在程序执

10、行过程中存在的动态时间。有些变量(如函数形参)没有生存期,但有作用域,而有些变量虽然有生存期,但不在作用域内。第14页,共33页,编辑于2022年,星期一例第15页,共33页,编辑于2022年,星期一可见性 p111可见性与作用域是一致的。第16页,共33页,编辑于2022年,星期一作用域限定符(:)p111这是C+所有的,C语言中没有。在C+语言中,可以通过(:)来标识引用同名的全局变量。以后在学习类的时候还要遇到。int s=0;void f()float s=3.0;/和全局变量同名int a;float a=2.0;:a=1;/错,a不是全局变量 :s=1;/通过:来访问全局变量s s

11、=2.0;/访问局部变量s第17页,共33页,编辑于2022年,星期一第三节多文件结构使用文件来组织程序可以提高程序的结构性,使各个功能的模块更为清晰。C+文件可以分为.cpp文件和.h文件两类,其中.cpp文件是后缀名为“.cpp”的文件,也称为源文件。.h文件是后缀名为“.h”的文件,也称为头文件。一个程序经常含有多个源文件,每个源文件都是一个独立的功能单元。通常情况下,每一个源文件都会有对应的头文件,作为源文件之间的接口。当使用其他源文件中的内容时,只需要包含其相应的头文件内容即可。(C文件的.c文件是后缀名为“.c”的文件)第18页,共33页,编辑于2022年,星期一源文件和头文件 p

12、114头文件原则上只存放可能被外部使用的内容,一般包含以下部分:1、类型声明,例如:typedef int int32_t;2、函数声明,例如:void hello_world(void);3、常量定义,包括具名常量和const常量,例如:#define ARRAY_SIZE 50const int MAX 256第19页,共33页,编辑于2022年,星期一多文件当程序规模较大时,一般会称程序为“项目工程”。项目工程也就是一个完整的C/C+程序,可以只有一个C/C+文件,也可以有成百上千个C/C+文件。第20页,共33页,编辑于2022年,星期一例 ch6_5第21页,共33页,编辑于2022

13、年,星期一第四节 编译预处理指令编译预处理是指在对源程序进行通常的编译之前,先对这些命令进行预处理,然后将预处理的结果和源程序一起再进行通常的编译处理。C+提供的编译预处理命令有:宏命令、文件包含命令、条件编译命令等,这些命令均以“#”开头,以区别于语句。1、文件包含#include2、宏命令#define3、条件编译命令#if#else.#endif#ifdef#else.#endif#ifndef#else.#endif第22页,共33页,编辑于2022年,星期一#include文件包含指令#include文件包含指令指示编译器将一个源文件嵌入到当前源文件中该指令处。两种使用形式:第一种形

14、式,#include 嵌入的源文件用尖括号括起来,告诉编译预处理程序在编译器自带的或外部库的头文件中搜索要嵌入的文件,它们一般是系统提供的公共头文件,存放在系统目录中的Include子目录下;第二种形式,#include 文件名“嵌入的源文件用双引号括起来,这种形式的#include指令告诉编译预处理指令先在当前子目录搜索要嵌入的文件,如果没有找到文件,再去搜索编译器自带的或外部库的头文件。第23页,共33页,编辑于2022年,星期一为什么要使用#include指令?函数调用出现在函数定义之前,或者调用在其它文件中(如系统库)定义的函数,必须先进行函数声明。系统函数按其功能被分成几大类,对应每

15、类函数有一个头文件,其中给出了这一类函数的原型声明,所以,我们只需在程序中使用#include指令包含相应的头文件,而不必在程序中直接进行函数的声明。以多文件方式组织的程序常常需要在各文件之间共享一些常量声明、变量声明、结构声明、函数声明和宏定义,可以将这些语句放在一个C+头文件中(以h作扩展名),然后利用#include指令将该头文件包含到需要这些内容的源文件中。第24页,共33页,编辑于2022年,星期一#define宏定义指令宏宏是一个表示特定内容的标识符,宏定义宏定义就是定义一个代表一个字符串或一段代码串的宏,被代表的内容称为宏体。在源程序中每遇到一个宏,编译程序均以定义的宏体替代之,

16、这种替代过程称之为宏替换宏替换。C/C+使用#define宏定义指令定义一个宏,其一般形式为:#define 宏名是一个用户自命名的、具有特定含义的标识符,宏体是由任意字符组成的字符序列。C+用const替代#define;用inline替代带参数的宏。第25页,共33页,编辑于2022年,星期一例如,编程时可以首先将一个数组的最大长度定义成一个宏#define MAXLENGTH 100.int nArrayMAXLENGTH;for(int i=0;i MAXLENGTH;i+).编译器对源程序进行编译时,每遇到一个宏MAXLENGTH时,都将其替换为100。对程序员而言,采用宏定义增加了

17、程序的可读性,并有利于以后程序的修改。第26页,共33页,编辑于2022年,星期一带参数的宏定义利用#define指令还可定义带参数的宏参数的宏。当编译器对这样的宏进行宏替换时,除了用宏体替代宏,还须用实际参数替代宏体中的参数。带参数的宏定义的一般形式为:#define (参数参数1,参数,参数2,参数,参数n)例如:#define MAX(a,b)(a)(b)?(a):(b)main()coutMAX(10,11)endl;第27页,共33页,编辑于2022年,星期一宏与内联函数的区别带参数的宏宏功能上与内联函数内联函数类似,但两者有本质的区别。宏替换是在正式编译之前,不进行参数的传递。函数

18、调用是发生在程序实际执行时,要进行实参与形参的传递。使用宏的好处是它不需要调用及返回时的开销,但宏有一些不安全因素,可能带来副作用。对于不带参数的宏,使用const常量类型取代宏会更安全。宏定义的取消:#undef 第28页,共33页,编辑于2022年,星期一条件编译指令条件编译预处理是指按照指定的条件决定哪些源程序段将被编译,而哪些源程序段将不被编译,从而使编译程序能够对用户的源程序有选择性地生成满足一定条件的目标程序。C/C+提供了几种不同形式的条件编译指令,可以根据一个表达式的值或者某个宏是否被定义来确定编译条件。条件编译指令条件编译指令的结构类似于C/C+的if结构,每种条件编译指令以

19、#if、#ifdef或#ifndef语句开始,中间可以有#else语句,最后以#endif语句表示一条编译指令的结束。第29页,共33页,编辑于2022年,星期一条件编译指令的三种形式#if#else#endif#ifdef#else#endif#ifndef#else#endif#if指令检测其后表达式的值是否为真,如果为真,则表示随后的源代码要参加编译,直到出现#else或#endif;如果不为真则这部分代码不参加编译。#ifdef指令是#if defined指令的缩写,它检测其后的宏是否被定义,如果被定义过则表示随后的源代码要参加编译。#ifndef指令也检测其后的宏是否被定义,但只有当

20、该宏没有被定义过,随后的源代码才参加编译。第30页,共33页,编辑于2022年,星期一例 使用条件编译指令1#if指令的用法。#include#define MAX 100/宏定义main()#if MAX99/条件编译cout MAX is greater than 99!endl;#elsecout MAX is small!endl;#endif程序运行后显示:程序运行后显示:MAX is greater than 99!第31页,共33页,编辑于2022年,星期一#ifdef指令的用法#define DEBUG/宏定义main()int nDebug=50;int nRealse=6;

21、/.#ifdef DEBUG/调试版 coutDEBUG:value of is nDebugendl;#else/正式版 coutRELEASE:value of is nRealseendl;#endif程序运行后显示:程序运行后显示:DEBUG:value of is 50第32页,共33页,编辑于2022年,星期一编程提示程序员在调试程序时,经常需要使用输出语句显示一些调试信息,这时,可以采用上面例题所介绍的方法:在源程序开头位置定义一个调试宏,在所有调试信息输出语句前加上#ifdef条件编译指令,在程序调试完之后,为了不再显示这些信息,只需删除源程序开头位置的宏定义指令,重新编译程序即可,程序其它地方无需改动。第33页,共33页,编辑于2022年,星期一

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁