C程序設(shè)計(jì)課件:第6章 程序結(jié)構(gòu)_第1頁
C程序設(shè)計(jì)課件:第6章 程序結(jié)構(gòu)_第2頁
C程序設(shè)計(jì)課件:第6章 程序結(jié)構(gòu)_第3頁
C程序設(shè)計(jì)課件:第6章 程序結(jié)構(gòu)_第4頁
C程序設(shè)計(jì)課件:第6章 程序結(jié)構(gòu)_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第六章 程序結(jié)構(gòu)1本章主要內(nèi)容6.1 外部存儲(chǔ)類型6.2 靜態(tài)存儲(chǔ)類型6.3 作用域6.4 可見性6.5 生命期6.6 頭文件6.7 多文件結(jié)構(gòu)6.8 編譯預(yù)處理作業(yè)2學(xué)習(xí)目標(biāo)熟悉內(nèi)存區(qū)和存儲(chǔ)類型的基本概念;掌握作用域、可見性和生命期的概念;學(xué)會(huì)使用頭文件;理解多文件結(jié)構(gòu);了解常見的編譯預(yù)處理命令。3存儲(chǔ)類型存儲(chǔ)類型是針對(duì)變量而言的,它規(guī)定了變量的生存期。無論是全局變量還是局部變量,編譯系統(tǒng)會(huì)根據(jù)其存儲(chǔ)方式定義、分配和釋放相應(yīng)的內(nèi)存空間。變量的存儲(chǔ)類型反映了變量在何處開辟內(nèi)存空間,以及占用內(nèi)存空間的有效期限。4存儲(chǔ)類型在C+中,變量有4種存儲(chǔ)類型:自動(dòng)類型(auto)、寄存器類型(regist

2、er) 、靜態(tài)類型(static)和外部類型(extern)。存儲(chǔ)類型指定的一般格式:存儲(chǔ)類型缺省時(shí)為自動(dòng)類型,在棧區(qū)中分配內(nèi)存空間,即,局部變量默認(rèn)為自動(dòng)類型。例:auto int sum; int sum;使用register聲明時(shí),可加快程序的運(yùn)行速度。若系統(tǒng)寄存器已經(jīng)被其他數(shù)據(jù)占據(jù),會(huì)自動(dòng)被當(dāng)做auto變量。 ; 56.1 外部存儲(chǔ)類型使用關(guān)鍵字extern聲明的變量稱為外部變量。當(dāng)某個(gè)變量被聲明成外部變量時(shí),不必再次為它分配內(nèi)存就可以在本程序中引用這個(gè)變量。在C+中,只有兩種情況需要使用外部變量:在同一個(gè)源文件中,若定義的變量使用在前,聲明在后,這時(shí)在使用前要聲明為外部變量。當(dāng)由多個(gè)

3、文件組成一個(gè)完整的程序時(shí),在一個(gè)源程序文件中定義的變量要被其他若干源文件引用時(shí),引用的文件中要用extern對(duì)該變量進(jìn)行外部聲明。66.1 外部存儲(chǔ)類型extern聲明:僅僅是聲明要使用一個(gè)在本文件外部定義的變量或函數(shù),而不是定義外部變量或函數(shù) 外部變量的聲明:可以多次聲明格式:extern 外部變量類型 變量名列表; 例:extern int a,b; extern char x,y; 7/ ch6_1.prj ch6_1.cpp ch6_1_1.cpp/*ch6_1.cpp#include void fn1( );void fn2( );int n; / 外部變量a的實(shí)際定義處int ma

4、in( ) n=3; fn1( ); /fn1( )函數(shù)的定義在本文件中 cout n endl;void fn1( ) fn2( ); /fn2( )函數(shù)的定義不在本文件中/*ch6_1_1.cppextern int n; / 聲明外部變量 a,void fn2( ) /fn2( )函數(shù)用于另一個(gè)源文件 n=8; /使用n運(yùn)行結(jié)果:8說明:函數(shù)聲明默認(rèn)為extern86.2 靜態(tài)存儲(chǔ)類型具有靜態(tài)存儲(chǔ)類型的變量,在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存空間。若在聲明變量類型時(shí)加上關(guān)鍵字static,則將其定義成了一個(gè)靜態(tài)類型的變量。在聲明靜態(tài)類型變量時(shí),若沒有指定初值,編譯器會(huì)將其置為0。靜態(tài)局部變量(5.5節(jié)

5、)靜態(tài)全局變量靜態(tài)函數(shù)96.2 靜態(tài)存儲(chǔ)類型1. 靜態(tài)全局變量全局變量定義時(shí),前面冠以static作用:使全局變量的作用域被限定在定義它的源文件中。 若程序只有一個(gè)源文件組成,在聲明全局變量時(shí),有無static沒有區(qū)別 若程序由多個(gè)源文件組成有無static,其作用完全不同。10/ch6_2.prj ch6_2.cpp ch6_2_1.cpp/*ch6_2.cpp#include int n;void fn( );int main( ) n=20; cout n endl; fn( );/ch6_2_1.cpp#include static int n; /n只在該文件內(nèi)有效,默認(rèn)初始化為0v

6、oid fn( ) n+; cout n endl;運(yùn)行結(jié)果: 20 1116.2 靜態(tài)存儲(chǔ)類型2. 靜態(tài)函數(shù)函數(shù)定義時(shí),前面冠以static作用:默認(rèn)情況下,函數(shù)的作用域是整個(gè)程序,對(duì)于多文件程序結(jié)構(gòu),一個(gè)函數(shù)可以被另一個(gè)文件使用,但靜態(tài)函數(shù)的作用域被限定在定義它源文件內(nèi),別的文件不能使用。 12/file1.cppvoid fn( );void staticFn( ); /link errorint main( ) fn( ); staticFn( );/file2.cpp#include static void staticFn( );void fn( );void fn( ) stat

7、icFn( ); coutthis is fn( )n;void staticFn( ) coutthis is staticFn( )n; /ch6_3.prj ch6_3.cpp ch6_3_1.cpp/*ch6_3.cppvoid fn( );int main( ) fn();/ch6_3_1.cpp#include static void staticFn( );void fn( );void fn( ) staticFn( ); cout this is fn( )n;void staticFn( )cout b; if (b0) int c; . a的作用域c的作用域b的作用域14

8、6.3 作用域說明:1)語句是一個(gè)程序單位,在if 和switch 語句的條件測試表達(dá)式中聲明標(biāo)識(shí)符,其作用域在該語句內(nèi)。 例如: if (int i=4) /i的作用域開始 i=2*i; else i=100; /i的作用域結(jié)束 couti5) int i=n; /整型i的作用域從此開始到此結(jié)束 else double i=n; /double i的作用域從此開始到此結(jié)束 coutiendl; /error i 無定義166.3 作用域3)在for語句的第一個(gè)表達(dá)式中聲明的標(biāo)識(shí)符,在標(biāo)準(zhǔn)C+中,其作用域在for語句內(nèi),但在VC+中其作用域是包含for語句的內(nèi)層塊。例如:在VC+中#inclu

9、deint main( ) for(int i=0,x=20,y=30;y200;i+) /i自此至本函數(shù)尾有效 int z=i+1; /z自此至本語句塊尾有效 cout(y+=x)endl; coutiendl; /合法 coutzendl; /error:z沒有定義176.3 作用域2. 函數(shù)作用域語句標(biāo)號(hào)是唯一具有函數(shù)作用域的標(biāo)識(shí)符一個(gè)標(biāo)識(shí)符不管在函數(shù)的什么地方定義,自函數(shù)的起始點(diǎn)起,至函數(shù)的終止點(diǎn)都有效,則此標(biāo)識(shí)符具有函數(shù)作用域。例如,下面的代碼聲明了兩個(gè)標(biāo)號(hào):186.3 作用域#include void fn( ) goto s; int b; cinb; if (b0) s: go

10、to end; end: coutall rightn; 196.3 作用域3.函數(shù)原型作用域函數(shù)聲明 (不是定義) 中的形參標(biāo)識(shí)符的作用域僅僅在函數(shù)原型中,其作用域始于(,結(jié)束于)。例:int max(int x,int y); x=100; /error:x沒有定義 例:設(shè)有下列原型聲明: double Area(double radius);radius 的作用域僅在于此,不能用于程序正文其它地方,因而可有可無。206.3 作用域4. 文件作用域文件作用域:在所有函數(shù)定義之外說明,其作用域從說明點(diǎn)開始,到源文件結(jié)束為止,也稱全局作用域。(1)全局常量或全局變量的作用域從定義開始到源程序文

11、件結(jié)束。 (2)若函數(shù)定義在后,調(diào)用在前,必須進(jìn)行函數(shù)原型聲明。 (3)對(duì)于頭文件中定義的標(biāo)識(shí)符,當(dāng)它們被預(yù)編譯時(shí),頭文件的內(nèi)容將在源文件的相應(yīng)位置展開,所以在頭文件中定義的標(biāo)識(shí)符的作用域可以看成從#include該頭文件開始的位置到源程序文件結(jié)束。 const float PI=3.14;int a;void main()/ void fun(void)/216.4 可見性可見性是從對(duì)標(biāo)識(shí)符的引用的角度來談的概念??梢娦员硎緩膬?nèi)層作用域向外層作用域“看”時(shí)能看見什么。一個(gè)標(biāo)識(shí)符是否可以被引用,稱為標(biāo)識(shí)符的可見性。如果標(biāo)識(shí)在某處可見,則就可以在該處引用此標(biāo)識(shí)符。文件作用域函數(shù)作用域塊作用域22

12、6.4 可見性標(biāo)識(shí)符應(yīng)聲明在先,引用在后。在同一作用域中,不能聲明同名的標(biāo)識(shí)符。如果某個(gè)標(biāo)識(shí)符在外層中聲明,且在內(nèi)層中沒有同一標(biāo)識(shí)符的聲明,則該標(biāo)識(shí)符在內(nèi)層可見。對(duì)于兩個(gè)嵌套的作用域,如果在內(nèi)層作用域內(nèi)聲明了與外層作用域中同名的標(biāo)識(shí)符,則外層作用域的標(biāo)識(shí)符在內(nèi)層不可見。23/*ch6_4.cpp#includeint id=3; /文件作用域int main( ) id=5; int id; /塊作用域 id=7; coutid=idendl; coutid=idendl; 6.4 可見性/輸出id=7/輸出id=5246.4 可見性如果被隱藏的是全局變量,則可用符號(hào):來引用該全局變量。 in

13、t s=0; void f( ) float s=3.0; int a; float a=2.0; :a=1; /error沒有全局變量a :s=1; s=2.0; 25生命期是指一個(gè)實(shí)體產(chǎn)生以后,存活時(shí)間的度量。生命期也稱為生存期,與存儲(chǔ)區(qū)域相關(guān)。靜態(tài)生命期動(dòng)態(tài)生命期局部生命期代碼區(qū)全局?jǐn)?shù)據(jù)區(qū)堆區(qū)棧區(qū)6.5 生命期266.5 生命期1. 靜態(tài)生命期在代碼區(qū)和全局?jǐn)?shù)據(jù)區(qū)分配空間的對(duì)象具有靜態(tài)生命期。這種生存期與程序的運(yùn)行期相同。在程序運(yùn)行的過程中占有固定的內(nèi)存空間。函數(shù)、全局變量、靜態(tài)局部變量、靜態(tài)全局變量都具有靜態(tài)生命期。靜態(tài)生命期的變量,若無顯示初始化,則自動(dòng)初始化為0。27#includ

14、eint i=5; /文件作用域int main( ) couti=iendl; return 0;i具有靜態(tài)生存期6.5 生命期286.5 生命期2. 局部生命期在棧區(qū)分配空間的對(duì)象具有局部生命期。非靜態(tài)的局部變量具有局部生命期,如果不進(jìn)行初始化,其值不確定。這種數(shù)據(jù)的生命期開始于局部數(shù)據(jù)創(chuàng)建之時(shí),結(jié)束于其作用域結(jié)束處。3. 動(dòng)態(tài)生命期在堆區(qū)動(dòng)態(tài)分配空間的對(duì)象具有動(dòng)態(tài)生命期。這種生命期開始于用new申請(qǐng)空間時(shí),結(jié)束于用delete釋放空間時(shí)。如果不釋放(即收回),則直到程序運(yùn)行結(jié)束,生命期才結(jié)束。29#includeint i=1; / i 為全局變量,具有靜態(tài)生存期。int main( )

15、 static int a; / 靜態(tài)局部變量,有全局壽命,局部可見。 int b=-10; int c=0; / b, c為局部變量,具有動(dòng)態(tài)生存期。 void other( ); cout-MAIN-n; cout i: i a: a b: b c: cendl; c=c+8; other( ); cout-MAIN-n; cout i: i a: a b: b c: cendl; i=i+10; other( ); 30void other( ) static int a=2; static int b; / a,b為靜態(tài)局部變量,具有全局壽命,局部可見。 /只第一次進(jìn)入函數(shù)時(shí)被初始化。

16、 int c=10; / C為局部變量,具有動(dòng)態(tài)生存期, /每次進(jìn)入函數(shù)時(shí)都初始化。 a=a+2; i=i+32; c=c+5; cout-OTHER-n; cout i: i a: a b: b c: cendl; b=a;31運(yùn)行結(jié)果:-MAIN- i: 1 a: 0 b: -10 c: 0-OTHER- i: 33 a: 4 b: 0 c: 15-MAIN- i: 33 a: 0 b: -10 c: 8-OTHER- i: 75 a: 6 b: 4 c: 1532小結(jié):對(duì)象存儲(chǔ)區(qū)作用域可見性生命期全局變量全局?jǐn)?shù)據(jù)區(qū)文件文件靜態(tài)靜態(tài)全局變量全局?jǐn)?shù)據(jù)區(qū)文件文件靜態(tài)靜態(tài)局部變量全局?jǐn)?shù)據(jù)區(qū)局部局

17、部靜態(tài)局部變量棧區(qū)局部局部局部函數(shù)代碼區(qū)文件文件靜態(tài)動(dòng)態(tài)變量堆區(qū) 動(dòng)態(tài)336.6 頭文件以.h為擴(kuò)展名的文件,用 #include 命令包含進(jìn)來適宜放在頭文件中的信息 類型聲明 函數(shù)聲明 內(nèi)聯(lián)函數(shù)定義 常量定義 數(shù)據(jù)聲明 枚舉 包含指令(可嵌套) 宏定義 注釋但頭文件不宜于包含: 一般函數(shù)定義 數(shù)據(jù)定義 常量聚集定義34/ch6_5.prj ch6_5.cpp mycircle.cpp myrect.cpp/*myarea.h double circle(double radius); double rect(double width,double length);/*mycircle.cpp

18、#include myarea.hconst float pi=3.14;double circle(double radius) return pi*radius*radius; 35/*myrect.cpp#include myarea.hdouble rect(double width,double length) return width*length;/*ch6_5.cpp#include #include myarea.hint main() double width,length; cout width length; cout area of rectangle is rect

19、(width,length) endl; double radius; cout radius; cout area of circle is circle(radius) endl;366.7 多文件結(jié)構(gòu)一個(gè)大程序可以由多個(gè)源文件組成,每個(gè)源文件可以進(jìn)行獨(dú)立編譯376.8 編譯預(yù)處理編譯預(yù)處理:C+ 的主要功能在程序中通過預(yù)處理命令實(shí)現(xiàn),不是C+ 的語句C+ 編譯系統(tǒng):先對(duì)程序中的特殊命令進(jìn)行預(yù)處理,然后把預(yù)處理結(jié)果和源程序一起進(jìn)行常規(guī)編譯處理(詞法、語法分析,代碼生成,優(yōu)化等)。 提供3種預(yù)處理功能: 宏定義 文件包含 均以“#”開頭 條件編譯386.8 編譯預(yù)處理1. #include

20、命令 作用:把指定的源文件(或:頭文件)的全部內(nèi)容包含到當(dāng)前文件中。 一般形式: #include#include“文件名”形式1:直接按系統(tǒng)標(biāo)準(zhǔn)方式檢索文件目錄形式2:在當(dāng)前源文件的目錄中尋找,找不到再按系統(tǒng)標(biāo)準(zhǔn)方式檢索其它文件目錄 396.8 編譯預(yù)處理說明:如果嵌套包含文件,則涉及到的全部文件均應(yīng)包含進(jìn)來,且最深一層被包含的文件所對(duì)應(yīng)的包含命令應(yīng)在最前面例如:文件3中包含文件2,文件2中又包含文件1,應(yīng)該: #include “文件1” #include “文件2” #include “文件3” 406.8 編譯預(yù)處理2. #define 命令 #define、#undef 命令宏定義:

21、宏代換作用域:自#define 起,#undef 或文件結(jié)束止 不帶參數(shù)的宏定義:作用:用指定的宏名(符號(hào)常量)代替一串字符形式:#define 宏名 字符序列 416.8 編譯預(yù)處理注意:兩者不同!例:#define Name 河南大學(xué) #define Name1 “河南大學(xué)”例:#define Name 河南大學(xué)#define Name1 “河南大學(xué)”int main( ) char n20=Name; char m20=Name1; 426.8 編譯預(yù)處理預(yù)處理后為:int main( ) char n20=河南大學(xué); /非法語句char m20=“河南大學(xué)”; /合法語句 436.8

22、編譯預(yù)處理說明: 一般用大寫標(biāo)識(shí)宏名宏名代表一個(gè)字符序列,預(yù)處理時(shí)不檢查其合法性,在編譯被宏展開后的源程序時(shí)進(jìn)行合法檢查宏定義不是語句,行末不必加分號(hào),如果加了,則一起轉(zhuǎn)換在宏定義中,可以利用已定義的宏用雙引號(hào)括起的為字符串常量,在雙引號(hào)中出現(xiàn)的宏名一概不替換 446.8 編譯預(yù)處理帶參數(shù)的宏定義:作用:除進(jìn)行字符序列替換外,再進(jìn)行參數(shù)替換一般形式:#define 宏名(參數(shù)列表) 字符序列宏替換過程:用指定的字符序列替換宏名,然后用實(shí)參替換參數(shù)列表中的形參 例:#define S(a,b) a*b+a/b x=S(5,7); 第一步:x=a*b+a/b; 第二步:x=5*7+5/7; 456.8 編譯預(yù)處理說明: 在宏名與參數(shù)列表的括號(hào)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論