第5章函數(shù)_第1頁
第5章函數(shù)_第2頁
第5章函數(shù)_第3頁
第5章函數(shù)_第4頁
第5章函數(shù)_第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、李坤陜西理工學院計算機科學與技術(shù)系Dept. of Comp. Sci. & Tech., SNUTFall, 2006l函數(shù)概述l函數(shù)定義的一般形式l函數(shù)的調(diào)用、參數(shù)和返回值l局部變量和全局變量l變量的存儲類型l內(nèi)部函數(shù)和外部函數(shù)lC語言用函數(shù)實現(xiàn)程序模塊化l一個程序由一個或多個源程序文件組成l一個源程序文件由一個或多個函數(shù)組成lC程序的執(zhí)行從main函數(shù)開始,并回到main函數(shù)結(jié)束l函數(shù)之間可以相互調(diào)用,或調(diào)用自身l不能調(diào)用main函數(shù)l函數(shù)之間相互獨立,不存在從屬關(guān)系l函數(shù)定義形式n返回類型 函數(shù)名(參數(shù)聲明) 聲明部分 語句l返回類型、參數(shù)、函數(shù)體內(nèi)容都可沒有ndummy()/* do

2、es nothing & returns nothing */l關(guān)于“返回類型”n指函數(shù)返回值的類型n若省略此項,則認為返回類型是intn若無返回值,則定義返回類型為voidl關(guān)于“參數(shù)聲明”n類型 形參名, 類型 形參名, .l關(guān)于“聲明部分”n指變量、函數(shù)的聲明int max(int x, int y)int z;z = xy?x:y;return z;int min(int x, int y)return xy?x:y; nmax(a, 3); /*函數(shù)調(diào)用*/l值傳遞n實參對形參的數(shù)據(jù)傳遞是“值傳遞”l單向傳遞n只能把實參的值傳遞給形參n不能把形參的值傳遞給實參n對形參的值所作的改變不

3、能帶回給實參l實參和形參是不同的變量n具有不同的存儲空間n具有不同的生存期和作用域void swap(int x, int y)int t;t=x, x=y, y=t;void main()int a=1, b=4;swap(a, b);1a4b1x4y41l形式n形式一:return;n形式二:return expression;l功能n函數(shù)返回語句n結(jié)束函數(shù)調(diào)用n如果需要,還可以帶回函數(shù)返回值l返回值的說明n函數(shù)返回值的類型在函數(shù)定義中指定n函數(shù)返回值通過函數(shù)中的return語句獲得n若函數(shù)無返回值,則可以沒有return語句nreturn語句后的表達式類型,應(yīng)與函數(shù)返回值類型相同,或可以

4、兼容賦值;兩者類型不同時,自動做類型轉(zhuǎn)換n函數(shù)需要返回值時,若缺少return語句,或return語句未帶返回值,則返回一個不確定值l一般形式n函數(shù)名(實參表列)l說明n即使沒有實參,()也不能省略n多個實參之間用逗號分隔n實參與形參按順序一一對應(yīng),類型應(yīng)匹配n實參的求值順序不確定,應(yīng)避免對此敏感的調(diào)用形式printf(%d,%d, i, i+);l函數(shù)語句nprintf(%dn, i);l函數(shù)表達式n(c + d * max(a,b) % el函數(shù)參數(shù)ngcd(max(a,b), min(c, d)l說明n函數(shù)調(diào)用可以看作同返回類型的表達式使用n同時,函數(shù)調(diào)用還完成了函數(shù)中定義的操作l一般形

5、式n類型 函數(shù)名(類型1, 類型2, .);n類型 函數(shù)名(類型1 形參1, 類型2 形參2, .);l舉例nint max(int, int);nint max(int x, int y);nvoid dummy(); /* 無參函數(shù)原型 */nvoid dummy(void); /* 同上 */l函數(shù)聲明的形式即函數(shù)原型l在函數(shù)調(diào)用之前,應(yīng)對函數(shù)進行聲明l函數(shù)聲明可以在主調(diào)函數(shù)的聲明部分,也可以在函數(shù)外部l函數(shù)外部的聲明,對所有主調(diào)函數(shù)都起作用,不需要在主調(diào)函數(shù)內(nèi)再次聲明l函數(shù)的定義也具有聲明的作用l庫函數(shù)的聲明包括在頭文件(*.h)里,不需在源程序里聲明void main()int ma

6、x(int x, int y); /* 函數(shù)聲明 */int a, b, c;c = max(a, b);int max(int x, int y)return xy?x:y;int max(int x, int y); /* 函數(shù)聲明 */void main()/* 不需要再次聲明int max(int, int) */int a, b, c; c = max(a, b);int max(int x, int y)return xy?x:y;int max(int x, int y)/* 函數(shù)定義具有聲明作用 */return xy?x:y;void main()/* 不需要再次聲明int

7、max(int, int) */int a, b, c;c = max(a, b);l調(diào)用一個函數(shù)的過程中,調(diào)用另一函數(shù)main函數(shù)函數(shù)結(jié)束結(jié)束調(diào)用調(diào)用a函數(shù)函數(shù)b函數(shù)函數(shù)a函數(shù)函數(shù)調(diào)用調(diào)用b函數(shù)函數(shù)l一個函數(shù)直接或間接的調(diào)用它自身l必須有一定的條件判斷語句,使得遞歸調(diào)用能夠終止f函數(shù)函數(shù)調(diào)用調(diào)用f函數(shù)函數(shù)f1函數(shù)函數(shù)調(diào)用調(diào)用f2函數(shù)函數(shù)f2函數(shù)函數(shù)調(diào)用調(diào)用f1函數(shù)函數(shù)l求階乘l作用域n變量有效的代碼空間n變量在作用域才能被引用n變量可以分為局部變量和全局變量l生存期n變量有效的運行時間n變量在生存期內(nèi)才存在n變量可以分為靜態(tài)存儲和動態(tài)存儲l局部變量n函數(shù)或復合語句內(nèi)部定義的變量l說明n作用域

8、為本函數(shù)或復合語句范圍n不同函數(shù)內(nèi)的局部變量可以重名,它們是不同的變量,作用域不同,不會相互干擾n函數(shù)形參也是局部變量的一種n若多個同名局部變量作用域重疊,則最內(nèi)層復合語句中定義的局部變量有效 float foo(int x) int a, i, j; /* 局部變量 */ . . /* 只能用在foo內(nèi)部 */ void main() int a, b, c; /* 局部變量 */ . . /* 只能用在main內(nèi)部 */ x,a,i,j作用域a,b,c作用域void main() int a, b, i; . . int c, i; c = a + b; i = a - b; . . .

9、.a,b,i作用域c,i作用域此范圍內(nèi)復合語句中定義的i有效l全局變量(外部變量)n函數(shù)之外定義的變量l說明n作用域從變量定義處到本源程序文件結(jié)束n全局變量可以被本文件的函數(shù)所共用n增加函數(shù)間傳遞數(shù)據(jù)的渠道n若全局變量與局部變量重名,則局部變量在作用域內(nèi)屏蔽全局變量n應(yīng)限制使用過多全局變量int a=10, b=5, x, y; /* 全局變量 */int max(int x, int y) return xy?x:y;int c; /* 全局變量 */void main() int a=8; c=max(a, b); /* 引用局部變量a */全局變量c作用域全局變量a,b,x,y作用域形參

10、x,y作用域局部變量a作用域l動態(tài)存儲方式n程序運行期間根據(jù)需要動態(tài)分配存儲空間n函數(shù)形參、自動變量等n每次調(diào)用函數(shù)時,給該函數(shù)中的局部變量和形參分配存儲空間,函數(shù)返回后釋放空間l靜態(tài)存儲方式n程序運行期間分配固定的存儲空間n全局變量全部存放在靜態(tài)存儲區(qū)中l(wèi)自動變量autol寄存器變量registerl靜態(tài)變量staticl外部變量externlauto變量n局部變量,用auto關(guān)鍵字修飾nauto可以省略,是缺省的存儲方式n自動分配和釋放存儲空間l舉例int foo(int x) auto int a, b, c=6; /* 定義自動變量a,b,c */ float f, g=0.1;/*

11、定義自動變量f,g */lregister變量n存放在CPU寄存器中,存取速度快n寄存器變量只能動態(tài)分配存儲空間(寄存器)n只有自動變量和形參可以作為寄存器變量l舉例int foo(int x) register int i;/* 定義寄存器變量i */ for(i=0; i10000; i+). /* i用于循環(huán)變量 */l靜態(tài)局部變量n局部變量,用static關(guān)鍵字修飾n靜態(tài)局部變量為靜態(tài)存儲,整個程序運行期間都不釋放,其值不會丟失n在函數(shù)調(diào)用結(jié)束后,靜態(tài)局部變量雖仍然存在,但已經(jīng)不在變量的作用域內(nèi),所以其他函數(shù)不能引用它n靜態(tài)局部變量在編譯時賦初值,且只賦一次n若不對靜態(tài)局部變量賦初值,

12、則初值為0int f(int a) int b=0; static int c=3; b+; c+; return a+b+c;void main() int x=2, i; for(i=0;iy?x:y;void main() extern A, B;/* extern聲明外部變量 */ printf(%d, max(A, B); /* 在定義之前使用外部變量 */int A=13, B=-8; /* 定義外部變量 */* file1.c */* 聲明外部變量 */extern A, B;void main() int c; c=max(A, B); printf(%d, c);/* fil

13、e2.c */* 定義外部變量 */int A=13, B=-8;int max(int x, int y) int z; z=xy?x:y; return z;l靜態(tài)外部變量n限制外部變量只能被本文件引用n靜態(tài)外部變量不能被其他文件引用l舉例/* file1.c */static int A;main() . ./* file2.c */extern int A;void foo(int n) A = A * n;不能引用靜態(tài)外部變量Al聲明 (Declaration)n對變量的某些屬性加以說明l定義 (Definition)n定義一個新的變量,并分配存儲空間n定義有聲明的功能,但聲明不一定

14、都是定義l舉例void main() extern A; /* 聲明而非定義,聲明A為已定義外部變量 */ . .int A; /* 定義A為整型外部變量 */l局部變量n自動變量(離開函數(shù),值就消失)n寄存器變量(離開函數(shù),值就消失)n形式參數(shù)(可為自動或寄存器變量)n靜態(tài)局部變量(離開函數(shù),值仍保留)l全局變量n靜態(tài)外部變量(只限本文件引用)n非靜態(tài)外部變量(允許其他文件引用)l動態(tài)存儲n自動變量(本函數(shù)內(nèi)有效)n寄存器變量(本函數(shù)內(nèi)有效)n形式參數(shù)(本函數(shù)內(nèi)有效)l靜態(tài)存儲n靜態(tài)局部變量(本函數(shù)內(nèi)有效)n靜態(tài)外部變量(本文件內(nèi)有效)n非靜態(tài)外部變量(其他文件可以引用)l內(nèi)存動態(tài)存儲區(qū)n自

15、動變量n形式參數(shù)l內(nèi)存靜態(tài)存儲區(qū)n靜態(tài)局部變量n靜態(tài)外部變量(本文件內(nèi)有效)n非靜態(tài)外部變量(其他文件可以引用)lCPU中的寄存器n寄存器變量變量存儲類型函數(shù)內(nèi)函數(shù)外作用域生存期作用域生存期自動變量 形式參數(shù)寄存器變量靜態(tài)局部變量靜態(tài)外部變量非靜態(tài)外部變量只限本文件其他文件也可以引用l定義形式nstatic 類型 函數(shù)名(形參表)l說明n內(nèi)部函數(shù)又稱靜態(tài)函數(shù)n內(nèi)部函數(shù)只能在所在文件中使用n類似于靜態(tài)外部變量的作用范圍l舉例nstatic int foo(int a, int b);l定義形式nextern 類型 函數(shù)名(形參表)l說明n可以在其他文件中調(diào)用nextern關(guān)鍵字在定義時可以省略n

16、需要調(diào)用該函數(shù)的文件中,用extern聲明該函數(shù)是外部定義的l舉例nextern int foo(int a, int b);l自動變量、形參、寄存器變量用法相同n寄存器變量存放在CPU中,但不影響用法l所有外部變量都是靜態(tài)存儲的n不管是不是static的外部變量lstatic關(guān)鍵字的意義n靜態(tài)局部變量,表示“靜態(tài)存儲”n靜態(tài)外部變量和函數(shù),表示只能用于本文件n非靜態(tài)外部變量和函數(shù),表示其他文件可以引用,外部引用時用extern加以聲明1. C語言可執(zhí)行程序的開始執(zhí)行點是語言可執(zhí)行程序的開始執(zhí)行點是 。A)程序中第一條可執(zhí)行語句)程序中第一條可執(zhí)行語句 B)程序中第一個函數(shù))程序中第一個函數(shù)C

17、)程序中的)程序中的main函數(shù)函數(shù)D)包含文件中的第一個函數(shù))包含文件中的第一個函數(shù)C2C語言的函數(shù)體中,下面語言的函數(shù)體中,下面 是正確的。是正確的。A)可以定義和調(diào)用其它函數(shù);)可以定義和調(diào)用其它函數(shù); B)可以調(diào)用但不能定義其它函數(shù);)可以調(diào)用但不能定義其它函數(shù);C)不可調(diào)用但可以定義其它函數(shù);)不可調(diào)用但可以定義其它函數(shù); D)不可調(diào)用及定義其它函數(shù)。)不可調(diào)用及定義其它函數(shù)。B3.以下敘述中正確的是以下敘述中正確的是 。A)C程序須由一個以上的函數(shù)組成程序須由一個以上的函數(shù)組成 B)C函數(shù)既可嵌套定義又可遞歸調(diào)用函數(shù)既可嵌套定義又可遞歸調(diào)用C)函數(shù)須有返回值)函數(shù)須有返回值,否則不

18、能調(diào)用否則不能調(diào)用 D)有調(diào)用關(guān)系的函數(shù)須在一個文件中)有調(diào)用關(guān)系的函數(shù)須在一個文件中A4函數(shù)返回值的類型應(yīng)由函數(shù)返回值的類型應(yīng)由 決定。決定。A)return中的表達式類型中的表達式類型 B)調(diào)用該函數(shù)的主調(diào)函數(shù)類型)調(diào)用該函數(shù)的主調(diào)函數(shù)類型C)定義函數(shù)所指定的類型)定義函數(shù)所指定的類型 D)實參類型)實參類型C5.以下敘述中不正確的是以下敘述中不正確的是 。A)一個函數(shù)中可以有多個)一個函數(shù)中可以有多個return語句語句 B)函數(shù)通過)函數(shù)通過return語句傳回函數(shù)值語句傳回函數(shù)值C)主函數(shù)可以有形參)主函數(shù)可以有形參 D)調(diào)用函數(shù)須獨立語句完成)調(diào)用函數(shù)須獨立語句完成D6實參和形參之

19、間的數(shù)據(jù)是實參和形參之間的數(shù)據(jù)是 傳遞。傳遞。A)地址)地址 B)值)值 C)互傳)互傳 D)用戶指定)用戶指定B7.以下敘述中不正確的是以下敘述中不正確的是 。 A)形參的值不能傳給實參)形參的值不能傳給實參 B)最好使用全局變量)最好使用全局變量 C)形參只局限于所在函數(shù))形參只局限于所在函數(shù) D)函數(shù)名的存儲類別是外部存儲類別)函數(shù)名的存儲類別是外部存儲類別B8數(shù)組名作為參數(shù)傳遞給函數(shù),作為實在參數(shù)數(shù)組名作為參數(shù)傳遞給函數(shù),作為實在參數(shù)的數(shù)組名被處理為的數(shù)組名被處理為 。A)該數(shù)組的長度;)該數(shù)組的長度; B)該數(shù)組的元素個數(shù);)該數(shù)組的元素個數(shù);C)該數(shù)組中各元素的值;)該數(shù)組中各元素

20、的值;D)該數(shù)組的首址。)該數(shù)組的首址。 D9.函數(shù)調(diào)用語句函數(shù)調(diào)用語句”f(e1,e2),(e3,e4,e5);”中參數(shù)的個數(shù)是中參數(shù)的個數(shù)是 。A)1 B)2 C)4 D)5B10退出循環(huán)而不終止函數(shù)的執(zhí)行的有效方法退出循環(huán)而不終止函數(shù)的執(zhí)行的有效方法是是 。A)break B)continue C)return D)exitA11.若對一個函數(shù)執(zhí)行在先,說明在后,若對一個函數(shù)執(zhí)行在先,說明在后,C語言將視其返語言將視其返回值為回值為 。A)非法;)非法; B)無返回值;)無返回值; C)浮點值;)浮點值; D)整型值。)整型值。D12C語言中函數(shù)的隱含存儲類型是語言中函數(shù)的隱含存儲類型是

21、 。A)auto B)static C)extern D)無存儲類別)無存儲類別C13.以下敘述中不正確的是以下敘述中不正確的是 。 A)在不同的函數(shù)中可以使用相同名字的變量)在不同的函數(shù)中可以使用相同名字的變量 B)函數(shù)中的形式參數(shù)是局部變量)函數(shù)中的形式參數(shù)是局部變量 C)在一個函數(shù)內(nèi)定義的變量只在本函數(shù)范圍內(nèi)有效)在一個函數(shù)內(nèi)定義的變量只在本函數(shù)范圍內(nèi)有效 D)在一個函數(shù)內(nèi)的復合語句中定義的變量在本函數(shù))在一個函數(shù)內(nèi)的復合語句中定義的變量在本函數(shù)范圍內(nèi)有效范圍內(nèi)有效D14在整個源文件都有效的變量在在整個源文件都有效的變量在 定義定義.A)第一個函數(shù)中)第一個函數(shù)中 B)第一個函數(shù)前)第一

22、個函數(shù)前 C)主函數(shù)中)主函數(shù)中 D)函數(shù)中靜態(tài)變量)函數(shù)中靜態(tài)變量B15下面程序的運行結(jié)果為:下面程序的運行結(jié)果為: void fun(int a,int b,int c) a=456;b=567;c=678;main() int x=10,y=20,z=30; fun (x,y,z); printf(%d,%d,%dn,z,y,x);30,20,1016下面程序的運行結(jié)果為:下面程序的運行結(jié)果為: 。#include func(int x, int y) int z; z=x+y; return z;main() int a=6,b=7,c=8,r; r=func(a-,b+,a+b),

23、c-); printf(%dn,r);21 17.下面程序的運行結(jié)果為:下面程序的運行結(jié)果為: func1(int a,int b) int c; a+=a; b+=b; c=func2(a,b); return(c*c);func2(int a,int b) int c; c=a*b%3; return(c);main() int x=7,y=17; printf(%dn,func1(x,y);418.下面程序的運行結(jié)果為:下面程序的運行結(jié)果為: #include int fun(int x,int y) static int m=0,i=2; i+=m+1; m=i+x+y; return m;main() int j=4,m=1,k; k=fun(j,m); printf(%d,k); k=fun(j,m); printf(%dn,k);8,1719.下面程序的運行結(jié)果為:下面程序的運行結(jié)果為: int i=1;main( )int i,j; i=reset( ); for(j=1;j=3;j+) printf(%dt%dt,i,j); printf(%dt,next(i); printf(%dt,last(i); printf(%dn,new(i+j); int reset( ) return(i);1 1 1 10 121 2 2 9 131 3 3

溫馨提示

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

評論

0/150

提交評論