函數(shù)聲明是對所用到的函數(shù)的特征_第1頁
函數(shù)聲明是對所用到的函數(shù)的特征_第2頁
函數(shù)聲明是對所用到的函數(shù)的特征_第3頁
函數(shù)聲明是對所用到的函數(shù)的特征_第4頁
函數(shù)聲明是對所用到的函數(shù)的特征_第5頁
已閱讀5頁,還剩83頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、繼續(xù)教學(xué)目的與要求 掌握函數(shù)的定義與調(diào)用方法,函數(shù)參數(shù)的傳遞方式 變量存儲類型及變量的生存期和有效范圍 掌握函數(shù)的嵌套調(diào)用與遞歸調(diào)用 了解帶參數(shù)的main函數(shù) 繼續(xù)重點(diǎn)與難點(diǎn)重點(diǎn): 函數(shù)定義 函數(shù)調(diào)用 函數(shù)聲明等基本概念 函數(shù)的嵌套調(diào)用與遞歸調(diào)用 數(shù)組作為函數(shù)的參數(shù) 變量的存儲類別與作用域難點(diǎn): 函數(shù)參數(shù)的值傳送與地址傳送 函數(shù)的遞歸調(diào)用 靜態(tài)變量 返回模塊化程序設(shè)計(jì) 模塊化程序設(shè)計(jì)就是進(jìn)行大程序設(shè)計(jì)的一種有效措施,其基本思想是:大的程序功能分割模塊C提供如下一些支持模塊化軟件開發(fā)的功能:(1)函數(shù)式的程序結(jié)構(gòu)程序整體由一個(gè)或多個(gè)函數(shù)組成。每個(gè)函數(shù)都具有各自獨(dú)立的功能和明顯的界面。(2)允許通

2、過使用不同存儲類別的變量,控制模 塊內(nèi)部及外部的信息交換。(3)具有編譯預(yù)處理功能,為程序的調(diào)試、移植 提供了方便,也支持了模塊化程序設(shè)計(jì)。返回函 數(shù) C程序結(jié)構(gòu) 函數(shù)的概述 函數(shù)的定義與函數(shù)聲明 函數(shù)的調(diào)用繼續(xù)C 程 序 結(jié) 構(gòu) 用C語言設(shè)計(jì)程序,任務(wù)只有一種,就是編寫函數(shù),至少也要編寫一個(gè)main( )函數(shù)。執(zhí)行C程序就是執(zhí)行相應(yīng)的main( )函數(shù)。 main( ) f1( ) ;f2( ) ; f1( ) f11( ) ; f2( ) f21( ) ;f22( ) ; f11( ) f21( ) f22( ) 返回C 程 序 結(jié) 構(gòu) 高級語言中“函數(shù)”的概念和數(shù)學(xué)中“函數(shù)”的概念不完全

3、相同。高級語言中的“函數(shù)”實(shí)際上是“功能”的意思。fun( )輸入輸出自頂向下、逐步細(xì)化的程序設(shè)計(jì)方法。main( )f1( )f2( )f11( )f21( )f22( )繼續(xù)函 數(shù) 的 概 述 調(diào)用其他函數(shù)的函數(shù)被稱為主調(diào)函數(shù),被其他函數(shù)調(diào)用的函數(shù)稱為被調(diào)函數(shù)。說明:1. 主調(diào)函數(shù)調(diào)用其他函數(shù)。2. 其他函數(shù)之間也可互相調(diào)用。3. 同一個(gè)函數(shù)可被一個(gè)或多個(gè)函數(shù)調(diào)用任意次。4. 一個(gè)源程序文件可由一個(gè)或多個(gè)函數(shù)組成。5. 使用函數(shù)時(shí)只需關(guān)心函數(shù)的功能和使用方法, 不關(guān)心其內(nèi)部的具體實(shí)現(xiàn)。繼續(xù)函 數(shù) 的 概 述例:main( ) func1( ); printf(“1.hello,worldn

4、”); func1( ) func2( ); printf(“2.hello,worldn”); func2( ) printf(“3.hello,worldn”); /*調(diào)用func1函數(shù)*/*func1函數(shù)的定義*/返回函 數(shù) 的 概 述在編寫函數(shù)時(shí),應(yīng)注意:(1)界面清晰。函數(shù)的處理子任務(wù)明確,函數(shù)之間數(shù)據(jù)傳遞越少越好。(2)大小適中。函數(shù)太大,處理任務(wù)復(fù)雜,導(dǎo)致結(jié)構(gòu)復(fù)雜,程序可讀性差;反之,函數(shù)太小,則程序調(diào)用關(guān)系復(fù)雜,降低程序的效率。返回函數(shù)的定義與函數(shù)聲明 定義函數(shù)就是在程序中設(shè)定一個(gè)函數(shù)模塊。一個(gè)函數(shù)是由變量聲明部分與可執(zhí)行語句組成的獨(dú)立實(shí)體,用以完成一指定的功能。 函數(shù)聲明是對

5、所用到的函數(shù)的特征進(jìn)行必要的聲明。編譯系統(tǒng)以函數(shù)聲明中給出的信息為依據(jù),對調(diào)用表達(dá)式進(jìn)行檢測,以保證調(diào)用表達(dá)式與函數(shù)之間的參數(shù)正確傳遞。 函數(shù)定義 函數(shù)聲明繼續(xù)函 數(shù) 定 義 函數(shù)定義的形式為:類型說明符 函數(shù)名(形參類型 形參,形參類型 形參,) 數(shù)據(jù)說明部分; 執(zhí)行語句部分;函數(shù)體說明:1. 函數(shù)名函數(shù)名應(yīng)符合C語言對標(biāo)識符的規(guī)定。繼續(xù)函 數(shù) 定 義2. 形式參數(shù) 形式參數(shù)寫在函數(shù)名后面的一對圓括號內(nèi),它有兩個(gè)作用:(1)表示將從主調(diào)函數(shù)中接收哪些類型的信息。有些 函數(shù)沒有形式參數(shù)。這時(shí),主函數(shù)main后面的圓 括號內(nèi)可以空,其它函數(shù)應(yīng)該在圓括號內(nèi)寫上void 以聲明它為空。(2)在函數(shù)體

6、中形式參數(shù)是可以被引用的,可以輸入、 輸出、被賦以新值或參與運(yùn)算。 程序進(jìn)行編譯時(shí),并不為形式參數(shù)分配存儲空間。只有在被調(diào)用時(shí),形式參數(shù)才臨時(shí)地占有存儲空間,從調(diào)用函數(shù)中獲得值,這稱為“虛實(shí)結(jié)合”,形參從相應(yīng)的實(shí)參得到值。繼續(xù)函 數(shù) 定 義例:定義了一個(gè)函數(shù)fun: fun(int a , int b) 當(dāng)它在main函數(shù)中用語句(設(shè)x,y已被賦值3,4)t=fun(x , y); 調(diào)用時(shí),虛實(shí)結(jié)合的情況如圖所示。main函數(shù)x 3y 4(實(shí)參)fun函數(shù)a 3b 4(形參)注意:形式參數(shù)的名字并不重要,關(guān)鍵在它們的數(shù)量及類型。繼續(xù)函 數(shù) 定 義3. 函數(shù)體函數(shù)體變量定義(即數(shù)據(jù)說明)語句(即

7、執(zhí)行語句)說明:在函數(shù)體中定義的變量只有在執(zhí)行該 函數(shù)時(shí)才存在。函數(shù)體中也可以不定義變量而只有語 句,也可以二者皆無。如:void null(void) 繼續(xù)函 數(shù) 定 義4. 函數(shù)的返回函數(shù)執(zhí)行的最后一個(gè)操作是返回。返回的意義是:(1)使流程返回主調(diào)函數(shù),宣告函數(shù)的一次執(zhí)行 終結(jié),在調(diào)用期間所分配的變量單元被撤銷。(2)送函數(shù)值到調(diào)用表達(dá)式中。有些函數(shù)有返回 值,有些函數(shù)可以沒有返回值。例:求一個(gè)整數(shù)的絕對值的函數(shù)。int absolute_value(int x) return(x=0?x:-x);return語句返回一個(gè)表達(dá)式的值繼續(xù)函 數(shù) 定 義例:打印n個(gè)空格的函數(shù)。void spc

8、(int n) int i ; for(i=0;in;i+) printf(“ “); return;不返回任何值到調(diào)用函數(shù)中允許將該return語句省去可以將流程返回調(diào)用函數(shù)改寫為:void spc(int n) int i ; for(i=0;in;i+) printf(“ “); 如果return語句后面不帶表達(dá)式則不返回任何值,僅將流程轉(zhuǎn)回主調(diào)函數(shù)。繼續(xù)函 數(shù) 定 義 在一個(gè)函數(shù)中允許有一個(gè)或多個(gè)return語句,流程執(zhí)行到其中一個(gè)return時(shí)即返回主調(diào)函數(shù)。例:對表達(dá)式y(tǒng)=x2-x+1 (x0)x3+x+3 (x0)可以寫出一個(gè)函數(shù): float y (float x) if (

9、x10) return (2*n+3); else return; 在編譯時(shí)將給出警告: Both return and return of a value used in!繼續(xù)函 數(shù) 定 義5. 函數(shù)的類型 函數(shù)的類型是指函數(shù)返回值的類型,即函數(shù)定義時(shí)所指出的類型。 函數(shù)在返回前要先將表達(dá)式的值轉(zhuǎn)換為所定義的類型,返回到主調(diào)函數(shù)中的調(diào)用表達(dá)式。注意:(1)int 型與char 型函數(shù)在定義時(shí)可以不 定義類型(即不寫int 或char),系 統(tǒng)隱含指定為int型。(2)對不需要使用函數(shù)返回值的函數(shù), 應(yīng)定義為void類型。返回函 數(shù) 定 義6. 函數(shù)定義的外部性 函數(shù)不能嵌套定義,一個(gè)函數(shù)不能

10、定義在別的函數(shù)的內(nèi)部。 func1 ( ) func2 ( ) 只能寫成: func1 ( ) func2 ( ) 一個(gè)程序如果用到多個(gè)函數(shù),允許把它們定義在不同的文件中,也允許一個(gè)文件中含有不同程序中的函數(shù)。繼續(xù)函 數(shù) 聲 明 所謂“聲明”是指向編譯系統(tǒng)提供必要的信息:函數(shù)名,函數(shù)的類型,函數(shù)參數(shù)的個(gè)數(shù)、類型及排列次序,以便編譯系統(tǒng)對函數(shù)的調(diào)用進(jìn)行檢查。函數(shù)聲明的一般格式為:類型標(biāo)識符 函數(shù)名(類型標(biāo)識符 形參,類型標(biāo)識符 形參,); 這些信息就是函數(shù)定義中的第一行(稱函數(shù)頭)的內(nèi)容,也稱函數(shù)模型(或函數(shù)原型)。繼續(xù)函 數(shù) 聲 明設(shè)有一函數(shù)的定義為: double func ( double

11、 a , int b , float c) /*函數(shù)體*/ 與之相應(yīng)的函數(shù)聲明應(yīng)為: double func ( double x , int y , float z ) ;也可以不寫形參名: double func (double , int , float ) ;但不能只寫形參名而不寫類型:double func ( x , y , z ) ;也不能不寫函數(shù)的類型:func ( double x , int y , float z ) ;注意:只有函數(shù)返回值為int或char時(shí),函數(shù)類型標(biāo)識符才可以省略。形參的次序也不能寫錯(cuò),不能寫成: double func ( int y , floa

12、t z , double x ) ;繼續(xù)函 數(shù) 聲 明注意:(1)函數(shù)的調(diào)用遵循“先定義,后調(diào)用”原則。 若被調(diào)用函數(shù)的定義在主調(diào)函數(shù)之后出 現(xiàn),就必須在主調(diào)函數(shù)中對被調(diào)用函數(shù) 加以聲明;反之,則無需聲明。(2)若在所有函數(shù)之前聲明了函數(shù)原型,則 該函數(shù)原型在本程序文件中任何地方都 有效。返回函 數(shù) 聲 明例如:float f ( float x , int y ); main( ) fun1( ) f(a,b); fun2( ) f(c,d); float f ( float x , int y ) /*放在所有函數(shù)之前,作統(tǒng)一聲明*/返回函 數(shù) 的 調(diào) 用 函數(shù)調(diào)用的一般形式 函數(shù)的傳值調(diào)

13、用 函數(shù)的嵌套調(diào)用 函數(shù)的遞歸調(diào)用返回函數(shù)調(diào)用的一般形式 調(diào)用子函數(shù)的形式 函數(shù)的調(diào)用方式 對被調(diào)用函數(shù)的說明 函數(shù)調(diào)用的執(zhí)行過程繼續(xù)調(diào)用子函數(shù)的形式聲明了函數(shù)原型后,便可以按如下形式調(diào)用子函數(shù):函數(shù)名(實(shí)參表)說明:(1)實(shí)參表中實(shí)參的個(gè)數(shù)多于一個(gè)時(shí),各 參數(shù)之間使用逗號分隔。(2)實(shí)參的個(gè)數(shù)、類型必須與對應(yīng)的形參 一致。(3)Turbo C系統(tǒng)按自右向左的順序求值。返回調(diào)用子函數(shù)的形式例:main ( ) int x=10; int y=x+; printf(“%d , %d”, (x+ , y ), y+); 注意:不要將函數(shù)參數(shù)的計(jì)算次序與一般表達(dá)式 計(jì)算相混淆。返回函數(shù)的調(diào)用方式可以

14、用三種方式調(diào)用函數(shù):(1)函數(shù)表達(dá)式。必須有一個(gè)明確的返回值,可以出現(xiàn)在任何允許表達(dá)式出現(xiàn)的地方,參與運(yùn)算。例如:y=power(2,3);(2)一條獨(dú)立函數(shù)調(diào)用語句。例如:func1( ); printf(“%d”, a );(3)函數(shù)參數(shù)。例如:y=pow(5 , pow(4 , 3) );返回對被調(diào)函數(shù)的說明(1)對用戶自定義函數(shù)在某些情況下需要進(jìn)行 函數(shù)說明。(2)對于系統(tǒng)標(biāo)準(zhǔn)函數(shù)(庫函數(shù)),一般注意 相關(guān)的頭文件。例如:對于字符串操作的函數(shù), 使用#include 對于數(shù)學(xué)函數(shù), 使用#include 返回函數(shù)調(diào)用的執(zhí)行過程main( )func( )結(jié)束返回func ( )例:編寫

15、一個(gè)求a的n次方的函數(shù)。double power(double a , int n );main( ) printf(“6 to the power 3 is %f”, power(6.0, 3); double power(double a , int n ) double sval=1.0; while(n-) sval*=a; return(sval);運(yùn)行結(jié)果為: 6 to the power 3 is 216.000000繼續(xù)函數(shù)的傳值調(diào)用 實(shí)參是調(diào)用函數(shù)中的變量,形參是被調(diào)函數(shù)中的變量。在函數(shù)調(diào)用過程中實(shí)現(xiàn)實(shí)參與形參的結(jié)合。 在c程序中,采用變量參數(shù)時(shí),實(shí)參與形參是按傳值方式相結(jié)合

16、的,也稱為傳值調(diào)用方式。傳值調(diào)用的過程:(1)形參與實(shí)參各占一個(gè)獨(dú)立的存儲空間。(2)形參的存儲空間是函數(shù)被調(diào)用時(shí)才分配的。實(shí)參xy34形參ab “值結(jié)合”(3)函數(shù)返回時(shí),臨時(shí)存儲區(qū)也被撤銷。34繼續(xù)函數(shù)的傳值調(diào)用 傳值調(diào)用的特點(diǎn)是:函數(shù)中對形參變量的操作不會影響到調(diào)用函數(shù)中的實(shí)參變量,即形參值不能傳回給實(shí)參。例:main( ) int a=3 , b=5; void swap ( int x , int y ); swap(a , b ); printf(“a=%d, b=%d n”, a, b ); void swap(int x , int y ) int temp; temp=x;

17、x=y; y=temp; printf(“x=%d, y=%d n”, x, y); 執(zhí)行結(jié)果: x=5,y=3 a=3,b=5繼續(xù)函數(shù)的傳值調(diào)用說明:(1)傳值調(diào)用方式,函數(shù)只有一個(gè)入口 實(shí)參傳值給形參,一個(gè)出口函數(shù)返 回值。(2)實(shí)參與形參在個(gè)數(shù)、類型上要匹配。(3)函數(shù)聲明的作用是為編譯系統(tǒng)對參數(shù)進(jìn) 行類型檢查提供依據(jù),并且在出現(xiàn)同名 函數(shù)時(shí),系統(tǒng)將根據(jù)類型和參數(shù)不同, 對它們加以區(qū)別。返回函數(shù)的傳值調(diào)用例:main( ) float add(unsigned int a , unsigned int b ); float x=1.5, y=-5.7; printf(“%f+%f=%fn

18、”, x, y, add(x,y); float add(unsigned int a , unsigned int b ) printf(“a=%u , b=%u n”,a , b ); return(a+b); 返回函數(shù)的嵌套調(diào)用 函數(shù)允許嵌套調(diào)用,即:在調(diào)用一個(gè)函數(shù)的過程中又調(diào)用另一個(gè)函數(shù)。注意:主函數(shù)main不可被其他任何函數(shù)調(diào)用。 例如,f1和f2是分別獨(dú)立定義的函數(shù),互不從屬,但在調(diào)用f1的過程中又要調(diào)用函數(shù)f2。其調(diào)用過程如圖:main函數(shù) u=f1(i , t); f1函數(shù) c=f2(b-1 , b+1);f2函數(shù)返回f2函數(shù)值函數(shù)的遞歸調(diào)用 函數(shù)可以直接或間接地調(diào)用自身,稱為

19、遞歸調(diào)用。前者稱為直接遞歸調(diào)用,后者稱為間接遞歸調(diào)用。 遞歸的實(shí)質(zhì):把需要求解的問題轉(zhuǎn)換成與原有問題類似的問題,按這一原則將問題分解下去,最終分解出來的問題是一個(gè)已知解的問題,這便是有限的遞歸。 遞歸的主要優(yōu)點(diǎn):使程序容易編制,可讀性強(qiáng),在算法上簡單,代碼緊湊。遞歸的缺點(diǎn):并不節(jié)省空間,運(yùn)行效率不高。 注意:每個(gè)遞歸過程都必須有一個(gè)“出口”,函數(shù)變化的趨勢應(yīng)靠近該出口,避免陷入無限循環(huán)。繼續(xù)函數(shù)的遞歸調(diào)用 遞歸的過程有兩個(gè)階段: 第一階段:遞推。將原問題分解成新的問題,最終到達(dá)已知條件,遞推階段結(jié)束。 第二階段:回歸。從已知的條件出發(fā),按照遞推的逆過程,逐一求值回歸,最后到達(dá)遞推的開始處,結(jié)束

20、回歸階段,完成遞歸調(diào)用。繼續(xù)函數(shù)的遞歸調(diào)用 例:遞歸計(jì)算n!的函數(shù)rfact( ) 。 long rfact( int n ) if ( n1)變量的存儲屬性繼續(xù)C語言程序占用的存儲空間通常分三部分:程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)1. 變量的存儲器類型存儲器內(nèi)存儲器(主存)內(nèi)存條外存儲器(輔存)光驅(qū)、磁盤等寄存器臨時(shí)存儲器 C語言允許程序員區(qū)分是在主存中還是在寄存器中開辟變量存儲空間。變量的存儲屬性繼續(xù)2. 變量的生存期(存在性)C語言中的變量可以用兩種方式建立:(1)在編譯時(shí)分配存儲單元,程序執(zhí)行開始后這種 變量即被創(chuàng)建,程序執(zhí)行結(jié)束即被撤銷。永久存儲(2)只在程序執(zhí)行的某一段時(shí)間內(nèi)存在。 例如

21、:函數(shù)的形參和在函數(shù)體或分程序中定義 的變量。動態(tài)存儲變量的存儲屬性繼續(xù)3. 變量的可用域(可見性)變量的可用域也可以分為兩種: 全局可用與局部可用。 在C語言中,用“存儲屬性”來表示以上三個(gè)方面的屬性。并且把它們分為四類:register, auto, static, extern。存儲屬性registerautostaticextern存儲位置寄存器主 存生存期動態(tài)生存期永久生存期作用域局部局部或全局全局 C語言要求,在定義一個(gè)變量時(shí),除了指定其數(shù)據(jù)類型以外,還可以指定其存儲類別。例如:register int a;int a ;變量的存儲屬性返回 動態(tài)變量 靜態(tài)變量 外部變量動 態(tài) 變

22、量返回 動態(tài)變量是在程序執(zhí)行的某一時(shí)刻被動態(tài)地建立并在另一時(shí)刻被動態(tài)地撤銷的一種變量,它們存在于程序的局部,也只在這個(gè)局部中可以使用。動態(tài)變量有兩種: 自動(auto)變量 寄存器(register)變量自 動 變 量繼續(xù) 因?yàn)榻⒑统蜂N這些變量都是由系統(tǒng)在程序執(zhí)行過程中自動進(jìn)行的,所以稱為自動變量。 當(dāng)程序的一個(gè)局部要使用某些自動變量時(shí),應(yīng)當(dāng)在使用之前先按如下形式進(jìn)行說明:auto 數(shù)據(jù)類型 變量名 =初值表達(dá)式,;注意:如果省略auto,系統(tǒng)隱含認(rèn)為此變量為auto。自 動 變 量繼續(xù)1. 自動變量是局部變量。自動變量只在定義它的那個(gè)局部才能使用。 例如,函數(shù)變量x例:main( ) in

23、t x=1; void prt(void); int x=3; prt( ); printf(“2nd x=%dn”, x ); printf(“1st x=%dn”, x); void prt(void) int x=5; printf(“3th x=%dn”, x ); 說明:C語言規(guī)定,如果內(nèi)層 與外層有相同名字的 變量,則在內(nèi)層范圍內(nèi) 只有內(nèi)層的變量有效, 外層的同名變量在此范 圍內(nèi)無效,或者說,外 層的變量被內(nèi)層的同名 變量“屏蔽”掉了。自 動 變 量繼續(xù)注意:1. 可以把臨時(shí)變量定義在需要用到它的局部內(nèi)。2. 使用自動變量有以下好處:(1)“用之則建,用完即撤”,可以節(jié)省大量 存儲

24、空間。(2)程序員無須關(guān)心程序的其它局部使用了 什么變量,可以獨(dú)立地給本區(qū)域命名變 量。(3)在一個(gè)局部中定義所需用的變量,便于 閱讀、理解程序。自 動 變 量繼續(xù)2. 在對自動變量賦值之前,它的值是不確定的。例:使用未賦初值的自動變量。 main( ) int i; printf(“i=%dn”,i);注意: 對于自動變量,必須對其賦初值后,才能引用它。自 動 變 量返回3. 對同一函數(shù)的兩次調(diào)用之間,自動變量的值是不 保留的,因?yàn)槠渌诘拇鎯卧驯会尫帕?。例:多次調(diào)用同一個(gè)函數(shù),測試其中的自動變量的值。 main( ) int i; int count(int n); for(i=1;i

25、=3;i+) count(i); int count(int n) int x; printf(“%d: x=%d,”, n, x ); x+=2; printf(“x+2=%dn”,x );運(yùn)行結(jié)果為: 1: x=1, x+2=3 2: x=2, x+2=4 3: x=3, x+2=5說明:1. 自動變量的生存期從函數(shù)被 調(diào)用開始,到函數(shù)調(diào)用返回 結(jié)束。2. 函數(shù)的形參也是一種自動變 量,但是在說明時(shí)不加存儲 類型標(biāo)識符“auto”。寄 存 器 變 量繼續(xù)特點(diǎn):1. 具有與自動變量完全相同的性質(zhì)。2. 被系統(tǒng)存放在CPU中的一個(gè)寄存器中。3. 通常把使用頻率較高的變量定義為register

26、類別。寄 存 器 變 量繼續(xù)例:有一個(gè)函數(shù):#include void m_table(void) register int i , j ; for(i=1;i=9;i+) for(j=1;j=i;j+) printf(“%d * %d =%2d ”, j, i,j*i ); putchar(n); main( ) void m_table(void); m_table( );寄 存 器 變 量函數(shù)的形參也可以使用寄存器變量,如:func(register int part1, register int part2) 說明:(1)并不是所有的寄存器變量都能夠保存在寄存器中。 能夠保存在寄存器中

27、的變量的數(shù)據(jù)類型只有 char,short,int,unsigned int和指針類型。(2)靜態(tài)局部變量和全局變量不能存儲在寄存器中, 也就是說寄存器不能以靜態(tài)方式存儲變量。(3)Turbo C將寄存器變量作自動變量處理,在內(nèi)存中 分配存儲空間,并非真把它們放到寄存器,所以 一般很少使用寄存器變量。返回靜 態(tài) 變 量繼續(xù)說明:(1)靜態(tài)變量的存儲空間在程序的整個(gè)運(yùn)行 期間是固定的(static)。一個(gè)變量被指定為靜態(tài)(固定),在編譯時(shí)就為其分配存儲空間,程序一開始執(zhí)行便被建立,直到該程序執(zhí)行結(jié)束都是存在的。(2)靜態(tài)變量的初始化是在編譯時(shí)進(jìn)行的。在定義時(shí)只能使用常量或常量表達(dá)式進(jìn)行顯式初始化

28、。未顯式初始化時(shí),編譯將把它們初始化為0(對int型)或0.0(對float型)。靜態(tài)變量的定義采用下面的格式:static 數(shù)據(jù)類型 變量名初始化常數(shù)表達(dá)式,;靜 態(tài) 變 量繼續(xù)注意:只有靜態(tài)變量和外部變量才是在編譯時(shí) 被創(chuàng)建的,才有初始化問題。所以對自 動變量稱為“賦初值”,而對靜態(tài)變量和 外部變量稱為“初始化”,以示區(qū)別。(3)在函數(shù)多次被調(diào)用的過程中,靜態(tài)局部變量 的值具有可繼承性。靜 態(tài) 變 量繼續(xù)例:比較下面兩個(gè)程序。 main( ) void increment(void); increment( ); increment( ); increment( ); void incre

29、ment(void) int x=0; x+; printf(“%dn”, x );運(yùn)行結(jié)果:1 1 1(變量x的值未被繼承) main( ) void increment(void); increment( ); increment( ); increment( ); void increment(void) static int x=0; x+; printf(“%dn”, x ); 運(yùn)行結(jié)果:1 2 3(變量x的值被繼承)賦初值初始化,只進(jìn)行一次靜 態(tài) 變 量(4)靜態(tài)局部變量的值只能在本函數(shù)(或分程序) 中使用。在一個(gè)函數(shù)(或分程序)中定義的變量是局部變量,它們只能在其局部范圍內(nèi)被引用

30、。注意:1. static類別變量在函數(shù)調(diào)用結(jié)束后其存儲單元 不釋放,其值具有繼承性。2. 生存期(存在期)表明變量的存儲空間在什 么時(shí)期存在,而作用域表明變量在程序哪個(gè) 語句區(qū)間可以使用,二者不可混淆。3. 定義靜態(tài)局部變量只是為了在多次調(diào)用同一 函數(shù)時(shí)使變量能保持上次調(diào)用結(jié)束時(shí)的 結(jié)果。返回外 部 變 量返回 外部變量是全局變量 外部變量使用的幾種情況 外部變量的副作用外部變量是全局變量繼續(xù) 在一個(gè)文件中,定義在所有函數(shù)之外的變量稱為外部變量。例如:int a=3,b=5; main( ) printf(“%d, %d n”,a,b); fun(void) printf(“%d, %d n

31、”,a,b); /*外部變量*/全程有效外部變量是全局變量繼續(xù)注意:在一個(gè)函數(shù)中改變了外部變量的值,那么其后 引用該變量時(shí),得到的是已被改變的值。例:交換兩個(gè)變量的值。 int a=3,b=5; main( ) void fun(void); printf(“a=%d, b=%d n”,a,b); fun( ); printf(“a=%d, b=%d n”,a,b); void fun(void) int c; c=a;a=b;b=c; 運(yùn)行結(jié)果: a=3, b=5 a=5, b=3外部變量是全局變量返回注意:外部變量也可以不出現(xiàn)在文件開頭,而出現(xiàn)在 兩個(gè)函數(shù)之間。例如:main( ) f1(

32、 ) int a, b; f2( ) float x, y; f3( ) 外部變量的作用域從其定義點(diǎn)開始到本文件末尾。 a, b作用域x, y作用域外部變量使用的幾種情況繼續(xù)1. 限定本文件的外部變量只在本文件使用如果有的外部變量只允許本文件使用而不允許其它文件使用,則可以在此外部變量前加一個(gè)static,使其有限局部化,稱作靜態(tài)外部變量。例:static int a=3, b=5; main( ) f1( ) f( ) 外部變量使用的幾種情況繼續(xù)注意:(1)外部變量是在編譯時(shí)分配存儲單元的, 它也不隨函數(shù)的調(diào)用與退出而建立和 釋放,也就是它的生存期是整個(gè)程序 的運(yùn)行周期。(2)在內(nèi)存的數(shù)據(jù)區(qū)

33、分兩個(gè)部分:靜態(tài)存 儲區(qū)和動態(tài)存儲區(qū)。自動變量和形參 存放在動態(tài)存儲區(qū),而靜態(tài)局部變量 和所有的外部變量存放在靜態(tài)存儲區(qū) 中。 使用靜態(tài)外部變量的好處是:當(dāng)多人分別編寫一個(gè)程序的不同文件時(shí),可以按照需要命名變量而不必考慮是否會與其它文件中的變量同名,以保證文件的獨(dú)立性。外部變量使用的幾種情況繼續(xù)對局部變量和全局變量的歸納定義位置存儲方式存儲區(qū)域存儲時(shí)間全局變量外部變量靜態(tài)存儲區(qū)程序運(yùn)行全過程靜態(tài)外部變量局部變量靜態(tài)局部變量自動變量動態(tài)存儲區(qū)調(diào)用函數(shù)全過程寄存器變量寄存器外部變量使用的幾種情況繼續(xù)例:產(chǎn)生一個(gè)隨機(jī)數(shù)的函數(shù)。采取以下公式來產(chǎn)生一個(gè)隨機(jī)數(shù)序列:r=(r*123+59)%65536,只

34、要給出一個(gè)r的初值,就能計(jì)算出下一個(gè)r(值在065535范圍內(nèi))。static unsigned int r;random(void) r=(r*123+59)%65536; return(r);unsigned random_start(unsigned int seed) r=seed; main( ) int i, n ; printf(“please enter the seed : “); scanf(“%d” , &n); random_start(n); for(i=1;i10;i+) printf(“%u”, random( );外部變量使用的幾種情況繼續(xù)注意:(1)把產(chǎn)生隨機(jī)

35、數(shù)的兩個(gè)函數(shù)和一個(gè)靜態(tài)外部 變量單獨(dú)組成一個(gè)文件,單獨(dú)編譯。(2)在編寫程序時(shí),往往將用到某一個(gè)或幾個(gè) 靜態(tài)外部變量的函數(shù)單獨(dú)編成一個(gè)小文件。(3)可以將這個(gè)文件放在函數(shù)庫中,用戶可以 調(diào)用函數(shù),但不能使用其中的靜態(tài)外部變 量(這個(gè)外部變量只供本文件中的函數(shù)使 用)。(4)static存儲類別可以使我們能建立一批可供 放在函數(shù)庫中的通用函數(shù),而不致引起數(shù) 據(jù)上的混亂。外部變量使用的幾種情況繼續(xù)2. 將外部變量的作用域在本文件范圍內(nèi)擴(kuò)充對于位于定義點(diǎn)之前的函數(shù),可以用extern說明符使變量的作用域擴(kuò)充到需要用到它的函數(shù)。例:利用extern聲明,擴(kuò)充外部變量的作用域。 main( ) void

36、 gx( ), gy( ) ; extern int x , y ; printf(“ 1 : x=%d y=%d n”, x , y ); y=246; gx( ); gy( ); void gx( ) extern int x , y ; x=135; printf(“ 2 : x=%d y=%d n”, x , y ); int x , y ; void gy( ) printf(“ 3 : x=%d y=%d n”, x , y );本函數(shù)中要用到的x,y是在本函數(shù)之外的外部變量運(yùn)行結(jié)果:1 : x=0 y=02 : x=135 y=2463 : x=135 y=246外部變量使用的幾

37、種情況繼續(xù) 除了可以在函數(shù)內(nèi)用extern說明變量以外,還可以將它寫在函數(shù)之外,以擴(kuò)充作用域,如上例可改寫為:extern int x , y ;main( ) void gx( ) int x , y ;void gy( ) x,y原作用域 x,y的新作用域注意:(1)對變量的定義在一個(gè)文件中只能有一次,而對變量 的聲明可以有多個(gè)。(2)定義變量是分配內(nèi)存單元,聲明變量只是通知 編譯系統(tǒng)一個(gè)信息:“此變量到外部去找”。外部變量使用的幾種情況返回3. 還可以將外部變量的作用域擴(kuò)充到其它文件例:例:file 1. c int x , y; char ch; main( ) x=12; y=24;

38、 f1( ); printf(“%c”, ch ); 注意:(1)操作的先后順序,只有先賦值才能引用。 這時(shí)在需要用到這些外部變量的文件中對變量用extern作聲明即可。 file 2. c extern int x , y; extern char ch; f1( ) printf(“%d, %dn”, x , y); ch=a; (2)在file2.c文件中不能再定義“自己的外部變量” x,y,ch,否則就會犯“重復(fù)定義”的錯(cuò)誤。外部變量的副作用繼續(xù)例:int i; main( ) void prt( ); for(i=0;i5;i+) prt( ); void prt( ) for(i=

39、0;i5;i+) printf(“%c”, *); printf(“n”); 運(yùn)行結(jié)果:* * * * *而程序設(shè)計(jì)者本來試圖打印一個(gè)由“*”組成的55的方陣: * * * * * * * * * * * * * * * * * * * * * * * * *外部變量的副作用返回 各模塊之間除了用參數(shù)傳遞信息之外,還增加了許多意想之外的渠道,造成模塊之間的聯(lián)系太多,對外部的依賴太多,降低了模塊的獨(dú)立性,給設(shè)計(jì)、調(diào)試、排錯(cuò)、維護(hù)都帶來困難。 此外,它無論是否使用,程序執(zhí)行時(shí)都占用固定的空間。因此,在程序設(shè)計(jì)時(shí)應(yīng)有限制地使用外部變量。編 譯 預(yù) 處 理返回 編譯預(yù)處理是在編譯前對源程序進(jìn)行的一些預(yù)

40、加工。預(yù)處理由編譯系統(tǒng)中的預(yù)處理程序按源程序中的預(yù)處理命令進(jìn)行。 C語言的預(yù)處理命令均以“#”打頭,末尾不加分號,以區(qū)別于C語句。它們可以出現(xiàn)在程序中的任何位置,其作用域是自出現(xiàn)點(diǎn)到所在源程序的末尾。宏定義分為兩種形式: 符號常量定義 帶參數(shù)的宏定義符 號 常 量 定 義繼續(xù) 為了提高程序的可讀性,可以使用宏定義,用宏名來表示常量。 定義符號常量的一般形式:# define 宏名 字符串符合對標(biāo)識符命名的規(guī)則,習(xí)慣上用大寫宏體注意:(1)預(yù)處理時(shí),將把程序中該宏定義之后的 所有宏名用宏體替換。(2)宏定義屬于編譯預(yù)處理命令,不是語 句,所以不需要在行末加分號。符 號 常 量 定 義繼續(xù) 例如: # define YES 1 對于宏定義,編譯時(shí)只作簡單的字符置換。如果程序中的預(yù)處理命令有錯(cuò),只能在真正的編譯階段才可檢查出來。# define SP scanf(“%d”, &x); printf(“%dn”, x);符 號 常 量 定 義繼續(xù)例:從鍵盤連續(xù)讀入字符,并統(tǒng)計(jì)其中數(shù)字的個(gè)數(shù), 直到讀入ESC字符為止。# inclu

溫馨提示

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

評論

0/150

提交評論