![函數(shù)聲明是對所用到的函數(shù)的特征_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/23/996f8216-fbcf-49a5-ad46-1c40038deb6f/996f8216-fbcf-49a5-ad46-1c40038deb6f1.gif)
![函數(shù)聲明是對所用到的函數(shù)的特征_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/23/996f8216-fbcf-49a5-ad46-1c40038deb6f/996f8216-fbcf-49a5-ad46-1c40038deb6f2.gif)
![函數(shù)聲明是對所用到的函數(shù)的特征_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/23/996f8216-fbcf-49a5-ad46-1c40038deb6f/996f8216-fbcf-49a5-ad46-1c40038deb6f3.gif)
![函數(shù)聲明是對所用到的函數(shù)的特征_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/23/996f8216-fbcf-49a5-ad46-1c40038deb6f/996f8216-fbcf-49a5-ad46-1c40038deb6f4.gif)
![函數(shù)聲明是對所用到的函數(shù)的特征_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/23/996f8216-fbcf-49a5-ad46-1c40038deb6f/996f8216-fbcf-49a5-ad46-1c40038deb6f5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、繼續(xù)教學目的與要求 掌握函數(shù)的定義與調(diào)用方法,函數(shù)參數(shù)的傳遞方式 變量存儲類型及變量的生存期和有效范圍 掌握函數(shù)的嵌套調(diào)用與遞歸調(diào)用 了解帶參數(shù)的main函數(shù) 繼續(xù)重點與難點重點: 函數(shù)定義 函數(shù)調(diào)用 函數(shù)聲明等基本概念 函數(shù)的嵌套調(diào)用與遞歸調(diào)用 數(shù)組作為函數(shù)的參數(shù) 變量的存儲類別與作用域難點: 函數(shù)參數(shù)的值傳送與地址傳送 函數(shù)的遞歸調(diào)用 靜態(tài)變量 返回模塊化程序設計 模塊化程序設計就是進行大程序設計的一種有效措施,其基本思想是:大的程序功能分割模塊C提供如下一些支持模塊化軟件開發(fā)的功能:(1)函數(shù)式的程序結構程序整體由一個或多個函數(shù)組成。每個函數(shù)都具有各自獨立的功能和明顯的界面。(2)允許通
2、過使用不同存儲類別的變量,控制模 塊內(nèi)部及外部的信息交換。(3)具有編譯預處理功能,為程序的調(diào)試、移植 提供了方便,也支持了模塊化程序設計。返回函 數(shù) C程序結構 函數(shù)的概述 函數(shù)的定義與函數(shù)聲明 函數(shù)的調(diào)用繼續(xù)C 程 序 結 構 用C語言設計程序,任務只有一種,就是編寫函數(shù),至少也要編寫一個main( )函數(shù)。執(zhí)行C程序就是執(zhí)行相應的main( )函數(shù)。 main( ) f1( ) ;f2( ) ; f1( ) f11( ) ; f2( ) f21( ) ;f22( ) ; f11( ) f21( ) f22( ) 返回C 程 序 結 構 高級語言中“函數(shù)”的概念和數(shù)學中“函數(shù)”的概念不完全
3、相同。高級語言中的“函數(shù)”實際上是“功能”的意思。fun( )輸入輸出自頂向下、逐步細化的程序設計方法。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. 同一個函數(shù)可被一個或多個函數(shù)調(diào)用任意次。4. 一個源程序文件可由一個或多個函數(shù)組成。5. 使用函數(shù)時只需關心函數(shù)的功能和使用方法, 不關心其內(nèi)部的具體實現(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ù)時,應注意:(1)界面清晰。函數(shù)的處理子任務明確,函數(shù)之間數(shù)據(jù)傳遞越少越好。(2)大小適中。函數(shù)太大,處理任務復雜,導致結構復雜,程序可讀性差;反之,函數(shù)太小,則程序調(diào)用關系復雜,降低程序的效率。返回函數(shù)的定義與函數(shù)聲明 定義函數(shù)就是在程序中設定一個函數(shù)模塊。一個函數(shù)是由變量聲明部分與可執(zhí)行語句組成的獨立實體,用以完成一指定的功能。 函數(shù)聲明是對
5、所用到的函數(shù)的特征進行必要的聲明。編譯系統(tǒng)以函數(shù)聲明中給出的信息為依據(jù),對調(diào)用表達式進行檢測,以保證調(diào)用表達式與函數(shù)之間的參數(shù)正確傳遞。 函數(shù)定義 函數(shù)聲明繼續(xù)函 數(shù) 定 義 函數(shù)定義的形式為:類型說明符 函數(shù)名(形參類型 形參,形參類型 形參,) 數(shù)據(jù)說明部分; 執(zhí)行語句部分;函數(shù)體說明:1. 函數(shù)名函數(shù)名應符合C語言對標識符的規(guī)定。繼續(xù)函 數(shù) 定 義2. 形式參數(shù) 形式參數(shù)寫在函數(shù)名后面的一對圓括號內(nèi),它有兩個作用:(1)表示將從主調(diào)函數(shù)中接收哪些類型的信息。有些 函數(shù)沒有形式參數(shù)。這時,主函數(shù)main后面的圓 括號內(nèi)可以空,其它函數(shù)應該在圓括號內(nèi)寫上void 以聲明它為空。(2)在函數(shù)體
6、中形式參數(shù)是可以被引用的,可以輸入、 輸出、被賦以新值或參與運算。 程序進行編譯時,并不為形式參數(shù)分配存儲空間。只有在被調(diào)用時,形式參數(shù)才臨時地占有存儲空間,從調(diào)用函數(shù)中獲得值,這稱為“虛實結合”,形參從相應的實參得到值。繼續(xù)函 數(shù) 定 義例:定義了一個函數(shù)fun: fun(int a , int b) 當它在main函數(shù)中用語句(設x,y已被賦值3,4)t=fun(x , y); 調(diào)用時,虛實結合的情況如圖所示。main函數(shù)x 3y 4(實參)fun函數(shù)a 3b 4(形參)注意:形式參數(shù)的名字并不重要,關鍵在它們的數(shù)量及類型。繼續(xù)函 數(shù) 定 義3. 函數(shù)體函數(shù)體變量定義(即數(shù)據(jù)說明)語句(即
7、執(zhí)行語句)說明:在函數(shù)體中定義的變量只有在執(zhí)行該 函數(shù)時才存在。函數(shù)體中也可以不定義變量而只有語 句,也可以二者皆無。如:void null(void) 繼續(xù)函 數(shù) 定 義4. 函數(shù)的返回函數(shù)執(zhí)行的最后一個操作是返回。返回的意義是:(1)使流程返回主調(diào)函數(shù),宣告函數(shù)的一次執(zhí)行 終結,在調(diào)用期間所分配的變量單元被撤銷。(2)送函數(shù)值到調(diào)用表達式中。有些函數(shù)有返回 值,有些函數(shù)可以沒有返回值。例:求一個整數(shù)的絕對值的函數(shù)。int absolute_value(int x) return(x=0?x:-x);return語句返回一個表達式的值繼續(xù)函 數(shù) 定 義例:打印n個空格的函數(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語句后面不帶表達式則不返回任何值,僅將流程轉(zhuǎn)回主調(diào)函數(shù)。繼續(xù)函 數(shù) 定 義 在一個函數(shù)中允許有一個或多個return語句,流程執(zhí)行到其中一個return時即返回主調(diào)函數(shù)。例:對表達式y(tǒng)=x2-x+1 (x0)x3+x+3 (x0)可以寫出一個函數(shù): float y (float x) if (
9、x10) return (2*n+3); else return; 在編譯時將給出警告: Both return and return of a value used in!繼續(xù)函 數(shù) 定 義5. 函數(shù)的類型 函數(shù)的類型是指函數(shù)返回值的類型,即函數(shù)定義時所指出的類型。 函數(shù)在返回前要先將表達式的值轉(zhuǎn)換為所定義的類型,返回到主調(diào)函數(shù)中的調(diào)用表達式。注意:(1)int 型與char 型函數(shù)在定義時可以不 定義類型(即不寫int 或char),系 統(tǒng)隱含指定為int型。(2)對不需要使用函數(shù)返回值的函數(shù), 應定義為void類型。返回函 數(shù) 定 義6. 函數(shù)定義的外部性 函數(shù)不能嵌套定義,一個函數(shù)不能
10、定義在別的函數(shù)的內(nèi)部。 func1 ( ) func2 ( ) 只能寫成: func1 ( ) func2 ( ) 一個程序如果用到多個函數(shù),允許把它們定義在不同的文件中,也允許一個文件中含有不同程序中的函數(shù)。繼續(xù)函 數(shù) 聲 明 所謂“聲明”是指向編譯系統(tǒng)提供必要的信息:函數(shù)名,函數(shù)的類型,函數(shù)參數(shù)的個數(shù)、類型及排列次序,以便編譯系統(tǒng)對函數(shù)的調(diào)用進行檢查。函數(shù)聲明的一般格式為:類型標識符 函數(shù)名(類型標識符 形參,類型標識符 形參,); 這些信息就是函數(shù)定義中的第一行(稱函數(shù)頭)的內(nèi)容,也稱函數(shù)模型(或函數(shù)原型)。繼續(xù)函 數(shù) 聲 明設有一函數(shù)的定義為: double func ( double
11、 a , int b , float c) /*函數(shù)體*/ 與之相應的函數(shù)聲明應為: 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ù)類型標識符才可以省略。形參的次序也不能寫錯,不能寫成: 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ù)名(實參表)說明:(1)實參表中實參的個數(shù)多于一個時,各 參數(shù)之間使用逗號分隔。(2)實參的個數(shù)、類型必須與對應的形參 一致。(3)Turbo C系統(tǒng)按自右向左的順序求值。返回調(diào)用子函數(shù)的形式例:main ( ) int x=10; int y=x+; printf(“%d , %d”, (x+ , y ), y+); 注意:不要將函數(shù)參數(shù)的計算次序與一般表達式 計算相混淆。返回函數(shù)的調(diào)用方式可以
14、用三種方式調(diào)用函數(shù):(1)函數(shù)表達式。必須有一個明確的返回值,可以出現(xiàn)在任何允許表達式出現(xiàn)的地方,參與運算。例如:y=power(2,3);(2)一條獨立函數(shù)調(diào)用語句。例如:func1( ); printf(“%d”, a );(3)函數(shù)參數(shù)。例如:y=pow(5 , pow(4 , 3) );返回對被調(diào)函數(shù)的說明(1)對用戶自定義函數(shù)在某些情況下需要進行 函數(shù)說明。(2)對于系統(tǒng)標準函數(shù)(庫函數(shù)),一般注意 相關的頭文件。例如:對于字符串操作的函數(shù), 使用#include 對于數(shù)學函數(shù), 使用#include 返回函數(shù)調(diào)用的執(zhí)行過程main( )func( )結束返回func ( )例:編寫
15、一個求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);運行結果為: 6 to the power 3 is 216.000000繼續(xù)函數(shù)的傳值調(diào)用 實參是調(diào)用函數(shù)中的變量,形參是被調(diào)函數(shù)中的變量。在函數(shù)調(diào)用過程中實現(xiàn)實參與形參的結合。 在c程序中,采用變量參數(shù)時,實參與形參是按傳值方式相結合
16、的,也稱為傳值調(diào)用方式。傳值調(diào)用的過程:(1)形參與實參各占一個獨立的存儲空間。(2)形參的存儲空間是函數(shù)被調(diào)用時才分配的。實參xy34形參ab “值結合”(3)函數(shù)返回時,臨時存儲區(qū)也被撤銷。34繼續(xù)函數(shù)的傳值調(diào)用 傳值調(diào)用的特點是:函數(shù)中對形參變量的操作不會影響到調(diào)用函數(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í)行結果: x=5,y=3 a=3,b=5繼續(xù)函數(shù)的傳值調(diào)用說明:(1)傳值調(diào)用方式,函數(shù)只有一個入口 實參傳值給形參,一個出口函數(shù)返 回值。(2)實參與形參在個數(shù)、類型上要匹配。(3)函數(shù)聲明的作用是為編譯系統(tǒng)對參數(shù)進 行類型檢查提供依據(jù),并且在出現(xiàn)同名 函數(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)用一個函數(shù)的過程中又調(diào)用另一個函數(shù)。注意:主函數(shù)main不可被其他任何函數(shù)調(diào)用。 例如,f1和f2是分別獨立定義的函數(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)用。 遞歸的實質(zhì):把需要求解的問題轉(zhuǎn)換成與原有問題類似的問題,按這一原則將問題分解下去,最終分解出來的問題是一個已知解的問題,這便是有限的遞歸。 遞歸的主要優(yōu)點:使程序容易編制,可讀性強,在算法上簡單,代碼緊湊。遞歸的缺點:并不節(jié)省空間,運行效率不高。 注意:每個遞歸過程都必須有一個“出口”,函數(shù)變化的趨勢應靠近該出口,避免陷入無限循環(huán)。繼續(xù)函數(shù)的遞歸調(diào)用 遞歸的過程有兩個階段: 第一階段:遞推。將原問題分解成新的問題,最終到達已知條件,遞推階段結束。 第二階段:回歸。從已知的條件出發(fā),按照遞推的逆過程,逐一求值回歸,最后到達遞推的開始處,結束
20、回歸階段,完成遞歸調(diào)用。繼續(xù)函數(shù)的遞歸調(diào)用 例:遞歸計算n!的函數(shù)rfact( ) 。 long rfact( int n ) if ( n1)變量的存儲屬性繼續(xù)C語言程序占用的存儲空間通常分三部分:程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)1. 變量的存儲器類型存儲器內(nèi)存儲器(主存)內(nèi)存條外存儲器(輔存)光驅(qū)、磁盤等寄存器臨時存儲器 C語言允許程序員區(qū)分是在主存中還是在寄存器中開辟變量存儲空間。變量的存儲屬性繼續(xù)2. 變量的生存期(存在性)C語言中的變量可以用兩種方式建立:(1)在編譯時分配存儲單元,程序執(zhí)行開始后這種 變量即被創(chuàng)建,程序執(zhí)行結束即被撤銷。永久存儲(2)只在程序執(zhí)行的某一段時間內(nèi)存在。 例如
21、:函數(shù)的形參和在函數(shù)體或分程序中定義 的變量。動態(tài)存儲變量的存儲屬性繼續(xù)3. 變量的可用域(可見性)變量的可用域也可以分為兩種: 全局可用與局部可用。 在C語言中,用“存儲屬性”來表示以上三個方面的屬性。并且把它們分為四類:register, auto, static, extern。存儲屬性registerautostaticextern存儲位置寄存器主 存生存期動態(tài)生存期永久生存期作用域局部局部或全局全局 C語言要求,在定義一個變量時,除了指定其數(shù)據(jù)類型以外,還可以指定其存儲類別。例如:register int a;int a ;變量的存儲屬性返回 動態(tài)變量 靜態(tài)變量 外部變量動 態(tài) 變
22、量返回 動態(tài)變量是在程序執(zhí)行的某一時刻被動態(tài)地建立并在另一時刻被動態(tài)地撤銷的一種變量,它們存在于程序的局部,也只在這個局部中可以使用。動態(tài)變量有兩種: 自動(auto)變量 寄存器(register)變量自 動 變 量繼續(xù) 因為建立和撤銷這些變量都是由系統(tǒng)在程序執(zhí)行過程中自動進行的,所以稱為自動變量。 當程序的一個局部要使用某些自動變量時,應當在使用之前先按如下形式進行說明:auto 數(shù)據(jù)類型 變量名 =初值表達式,;注意:如果省略auto,系統(tǒng)隱含認為此變量為auto。自 動 變 量繼續(xù)1. 自動變量是局部變量。自動變量只在定義它的那個局部才能使用。 例如,函數(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. 可以把臨時變量定義在需要用到它的局部內(nèi)。2. 使用自動變量有以下好處:(1)“用之則建,用完即撤”,可以節(jié)省大量 存儲
24、空間。(2)程序員無須關心程序的其它局部使用了 什么變量,可以獨立地給本區(qū)域命名變 量。(3)在一個局部中定義所需用的變量,便于 閱讀、理解程序。自 動 變 量繼續(xù)2. 在對自動變量賦值之前,它的值是不確定的。例:使用未賦初值的自動變量。 main( ) int i; printf(“i=%dn”,i);注意: 對于自動變量,必須對其賦初值后,才能引用它。自 動 變 量返回3. 對同一函數(shù)的兩次調(diào)用之間,自動變量的值是不 保留的,因為其所在的存儲單元已被釋放了。例:多次調(diào)用同一個函數(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 );運行結果為: 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)用返回 結束。2. 函數(shù)的形參也是一種自動變 量,但是在說明時不加存儲 類型標識符“auto”。寄 存 器 變 量繼續(xù)特點:1. 具有與自動變量完全相同的性質(zhì)。2. 被系統(tǒng)存放在CPU中的一個寄存器中。3. 通常把使用頻率較高的變量定義為register
26、類別。寄 存 器 變 量繼續(xù)例:有一個函數(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)變量的存儲空間在程序的整個運行 期間是固定的(static)。一個變量被指定為靜態(tài)(固定),在編譯時就為其分配存儲空間,程序一開始執(zhí)行便被建立,直到該程序執(zhí)行結束都是存在的。(2)靜態(tài)變量的初始化是在編譯時進行的。在定義時只能使用常量或常量表達式進行顯式初始化
28、。未顯式初始化時,編譯將把它們初始化為0(對int型)或0.0(對float型)。靜態(tài)變量的定義采用下面的格式:static 數(shù)據(jù)類型 變量名初始化常數(shù)表達式,;靜 態(tài) 變 量繼續(xù)注意:只有靜態(tài)變量和外部變量才是在編譯時 被創(chuàng)建的,才有初始化問題。所以對自 動變量稱為“賦初值”,而對靜態(tài)變量和 外部變量稱為“初始化”,以示區(qū)別。(3)在函數(shù)多次被調(diào)用的過程中,靜態(tài)局部變量 的值具有可繼承性。靜 態(tài) 變 量繼續(xù)例:比較下面兩個程序。 main( ) void increment(void); increment( ); increment( ); increment( ); void incre
29、ment(void) int x=0; x+; printf(“%dn”, x );運行結果:1 1 1(變量x的值未被繼承) main( ) void increment(void); increment( ); increment( ); increment( ); void increment(void) static int x=0; x+; printf(“%dn”, x ); 運行結果:1 2 3(變量x的值被繼承)賦初值初始化,只進行一次靜 態(tài) 變 量(4)靜態(tài)局部變量的值只能在本函數(shù)(或分程序) 中使用。在一個函數(shù)(或分程序)中定義的變量是局部變量,它們只能在其局部范圍內(nèi)被引用
30、。注意:1. static類別變量在函數(shù)調(diào)用結束后其存儲單元 不釋放,其值具有繼承性。2. 生存期(存在期)表明變量的存儲空間在什 么時期存在,而作用域表明變量在程序哪個 語句區(qū)間可以使用,二者不可混淆。3. 定義靜態(tài)局部變量只是為了在多次調(diào)用同一 函數(shù)時使變量能保持上次調(diào)用結束時的 結果。返回外 部 變 量返回 外部變量是全局變量 外部變量使用的幾種情況 外部變量的副作用外部變量是全局變量繼續(xù) 在一個文件中,定義在所有函數(shù)之外的變量稱為外部變量。例如:int a=3,b=5; main( ) printf(“%d, %d n”,a,b); fun(void) printf(“%d, %d n
31、”,a,b); /*外部變量*/全程有效外部變量是全局變量繼續(xù)注意:在一個函數(shù)中改變了外部變量的值,那么其后 引用該變量時,得到的是已被改變的值。例:交換兩個變量的值。 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; 運行結果: a=3, b=5 a=5, b=3外部變量是全局變量返回注意:外部變量也可以不出現(xiàn)在文件開頭,而出現(xiàn)在 兩個函數(shù)之間。例如:main( ) f1(
32、 ) int a, b; f2( ) float x, y; f3( ) 外部變量的作用域從其定義點開始到本文件末尾。 a, b作用域x, y作用域外部變量使用的幾種情況繼續(xù)1. 限定本文件的外部變量只在本文件使用如果有的外部變量只允許本文件使用而不允許其它文件使用,則可以在此外部變量前加一個static,使其有限局部化,稱作靜態(tài)外部變量。例:static int a=3, b=5; main( ) f1( ) f( ) 外部變量使用的幾種情況繼續(xù)注意:(1)外部變量是在編譯時分配存儲單元的, 它也不隨函數(shù)的調(diào)用與退出而建立和 釋放,也就是它的生存期是整個程序 的運行周期。(2)在內(nèi)存的數(shù)據(jù)區(qū)
33、分兩個部分:靜態(tài)存 儲區(qū)和動態(tài)存儲區(qū)。自動變量和形參 存放在動態(tài)存儲區(qū),而靜態(tài)局部變量 和所有的外部變量存放在靜態(tài)存儲區(qū) 中。 使用靜態(tài)外部變量的好處是:當多人分別編寫一個程序的不同文件時,可以按照需要命名變量而不必考慮是否會與其它文件中的變量同名,以保證文件的獨立性。外部變量使用的幾種情況繼續(xù)對局部變量和全局變量的歸納定義位置存儲方式存儲區(qū)域存儲時間全局變量外部變量靜態(tài)存儲區(qū)程序運行全過程靜態(tài)外部變量局部變量靜態(tài)局部變量自動變量動態(tài)存儲區(qū)調(diào)用函數(shù)全過程寄存器變量寄存器外部變量使用的幾種情況繼續(xù)例:產(chǎn)生一個隨機數(shù)的函數(shù)。采取以下公式來產(chǎn)生一個隨機數(shù)序列:r=(r*123+59)%65536,只
34、要給出一個r的初值,就能計算出下一個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)生隨機
35、數(shù)的兩個函數(shù)和一個靜態(tài)外部 變量單獨組成一個文件,單獨編譯。(2)在編寫程序時,往往將用到某一個或幾個 靜態(tài)外部變量的函數(shù)單獨編成一個小文件。(3)可以將這個文件放在函數(shù)庫中,用戶可以 調(diào)用函數(shù),但不能使用其中的靜態(tài)外部變 量(這個外部變量只供本文件中的函數(shù)使 用)。(4)static存儲類別可以使我們能建立一批可供 放在函數(shù)庫中的通用函數(shù),而不致引起數(shù) 據(jù)上的混亂。外部變量使用的幾種情況繼續(xù)2. 將外部變量的作用域在本文件范圍內(nèi)擴充對于位于定義點之前的函數(shù),可以用extern說明符使變量的作用域擴充到需要用到它的函數(shù)。例:利用extern聲明,擴充外部變量的作用域。 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ù)之外的外部變量運行結果:1 : x=0 y=02 : x=135 y=2463 : x=135 y=246外部變量使用的幾
37、種情況繼續(xù) 除了可以在函數(shù)內(nèi)用extern說明變量以外,還可以將它寫在函數(shù)之外,以擴充作用域,如上例可改寫為:extern int x , y ;main( ) void gx( ) int x , y ;void gy( ) x,y原作用域 x,y的新作用域注意:(1)對變量的定義在一個文件中只能有一次,而對變量 的聲明可以有多個。(2)定義變量是分配內(nèi)存單元,聲明變量只是通知 編譯系統(tǒng)一個信息:“此變量到外部去找”。外部變量使用的幾種情況返回3. 還可以將外部變量的作用域擴充到其它文件例:例:file 1. c int x , y; char ch; main( ) x=12; y=24;
38、 f1( ); printf(“%c”, ch ); 注意:(1)操作的先后順序,只有先賦值才能引用。 這時在需要用到這些外部變量的文件中對變量用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,否則就會犯“重復定義”的錯誤。外部變量的副作用繼續(xù)例:int i; main( ) void prt( ); for(i=0;i5;i+) prt( ); void prt( ) for(i=
39、0;i5;i+) printf(“%c”, *); printf(“n”); 運行結果:* * * * *而程序設計者本來試圖打印一個由“*”組成的55的方陣: * * * * * * * * * * * * * * * * * * * * * * * * *外部變量的副作用返回 各模塊之間除了用參數(shù)傳遞信息之外,還增加了許多意想之外的渠道,造成模塊之間的聯(lián)系太多,對外部的依賴太多,降低了模塊的獨立性,給設計、調(diào)試、排錯、維護都帶來困難。 此外,它無論是否使用,程序執(zhí)行時都占用固定的空間。因此,在程序設計時應有限制地使用外部變量。編 譯 預 處 理返回 編譯預處理是在編譯前對源程序進行的一些預
40、加工。預處理由編譯系統(tǒng)中的預處理程序按源程序中的預處理命令進行。 C語言的預處理命令均以“#”打頭,末尾不加分號,以區(qū)別于C語句。它們可以出現(xiàn)在程序中的任何位置,其作用域是自出現(xiàn)點到所在源程序的末尾。宏定義分為兩種形式: 符號常量定義 帶參數(shù)的宏定義符 號 常 量 定 義繼續(xù) 為了提高程序的可讀性,可以使用宏定義,用宏名來表示常量。 定義符號常量的一般形式:# define 宏名 字符串符合對標識符命名的規(guī)則,習慣上用大寫宏體注意:(1)預處理時,將把程序中該宏定義之后的 所有宏名用宏體替換。(2)宏定義屬于編譯預處理命令,不是語 句,所以不需要在行末加分號。符 號 常 量 定 義繼續(xù) 例如: # define YES 1 對于宏定義,編譯時只作簡單的字符置換。如果程序中的預處理命令有錯,只能在真正的編譯階段才可檢查出來。# define SP scanf(“%d”, &x); printf(“%dn”, x);符 號 常 量 定 義繼續(xù)例:從鍵盤連續(xù)讀入字符,并統(tǒng)計其中數(shù)字的個數(shù), 直到讀入ESC字符為止。# inclu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 代理鋁錠銷售合同范本
- 農(nóng)田租聘合同范例
- 個人債權轉(zhuǎn)移合同范本
- 企業(yè)logo設計合同范例
- 東莞市合同范例
- 農(nóng)村建筑包工合同范本
- pvc銷售合同范本
- 關于護欄加工合同范本
- 2025年度建筑工程施工許可證代辦承包合同范本
- LNG氣瓶檢驗合同范例
- 中學生低碳生活調(diào)查報告
- 東軟入職合同
- 游泳池經(jīng)營合作方案
- 擘畫未來技術藍圖
- 基于情報基本理論的公安情報
- 《“白山黑水”-東北三省》示范課課件(第1課時)
- 孔氏家廟的社會調(diào)查報告
- 員工節(jié)能環(huán)保培訓課件
- 華為公司的內(nèi)部審計制度
- 腫瘤醫(yī)院病歷書寫培訓課件
- 《蓄電池培訓》課件
評論
0/150
提交評論