版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第6章函數(shù)與宏定義6.1函數(shù)概念C函數(shù)分標準函數(shù)(庫函數(shù))和自定義函數(shù)。所有函數(shù)都是平行的,相互獨立不能嵌套定義,函數(shù)間可以相互調(diào)用,但不能調(diào)用main()函數(shù)。6.1.1
函數(shù)的定義古典形式:類型標識符
函數(shù)名(形式參數(shù)表)形式參數(shù)說明;{函數(shù)體;}現(xiàn)代簡潔形式:類型標識符函數(shù)名(形參說明表){函數(shù)體;}函數(shù)參數(shù)和函數(shù)的值1.形式參數(shù)和實際參數(shù)例從鍵盤輸入兩個數(shù),輸出其中較大的一個。main(){inta,b,c;scanf("%d%d",&a,&b);c=max(a,b);/*a,b為實際參數(shù)*/printf("Maxis%d",c);getch();}max(intx,inty)/*x,y為形式參數(shù)*/{intz;z=x>y?x:y;return(z);}形參變量在被調(diào)用前不占用存儲單元;在被調(diào)用結(jié)束后,形參所占存儲單元亦被釋放。
實參可以是常量、變量或表達式。必須指定形參類型,且應與實參的類型一致。實參對形參的數(shù)據(jù)傳遞是“值傳遞”。即單向傳遞,不能逆?zhèn)鳌?/p>
注意:函數(shù)的返回值是通過return語句獲得的。return語句的后面可以有括號,也可以沒有。如: returnz;return(z);
return語句的后面可以是變量,也可以是表達式。如: return(x>y?x:y);return語句返回值的類型應與該函數(shù)的類型一致。否則以函數(shù)類型為準。函數(shù)類型缺省時按整型處理。2.函數(shù)的返回值1.函數(shù)調(diào)用的一般形式
函數(shù)名(實參表)說明:對于無參函數(shù),也不得省略一對小括號?!皩崊⒈怼敝械膮?shù)之間用逗號分開。
實參與形參之間的個數(shù)及類型必須一一對應。函數(shù)的調(diào)用
將函數(shù)調(diào)用作為一個語句。如: printf(“MSCpragramming”);gets(s);將被調(diào)用的函數(shù)寫在表達式中。如: c=2max(a,b);注意:被調(diào)用函數(shù)max必須有確定的返回值。
將函數(shù)調(diào)用作為一個函數(shù)的實參。如: m=max(max(a,b),c);
2.函數(shù)調(diào)用的方式3.對被調(diào)用函數(shù)的說明在一個函數(shù)中調(diào)用另一個函數(shù)時:如果被調(diào)函數(shù)為庫函數(shù),則應在文件開頭用“#include”命令聲明相應的“頭文件”。如: #include“stdio.h” #include“math.h”
如果被調(diào)函數(shù)為自定義函數(shù)且其定義在主調(diào)函數(shù)定義之后,則應在主調(diào)函數(shù)中對該函數(shù)進行聲明。其語句形式一般為:類型標識符被調(diào)函數(shù)名(參數(shù)列表);如:floatadd(intx,inty);1.局部變量 局部變量----在一個函數(shù)內(nèi)部定義的變量,只能在本函數(shù)內(nèi)使用和有效。主函數(shù)main中定義的變量,也只能在主函數(shù)內(nèi)使用和有效。不同的函數(shù)中可以使用相同名字變量,且互不干擾。形式參數(shù)也是局部變量,也只能在所在函數(shù)內(nèi)使用和有效??梢栽谝粋€函數(shù)內(nèi)的復合語句中定義變量,且這些變量只在本復合語句中有效。這種復合語句也稱為“分程序”或“子模塊”。局部變量和全局變量6.2變量的作用域和存儲類型2.全局變量全局變量(外部變量)-----在函數(shù)(包括main函數(shù))外定義的變量。其有效范圍為從定義變量的位置開始到本源文件結(jié)束。在文件開頭定義的外部變量才可在整個文件范圍內(nèi)使用,若在定義點之前的函數(shù)需引用外部變量,則可用關(guān)鍵字“extern”作“外部變量聲明”。注意:外部變量的定義只能有一次,它的位置在所有函數(shù)之外。而同一程序中的外部變量聲明可以有多次,它的位置在函數(shù)之內(nèi)(哪個函數(shù)要用就在哪個函數(shù)中說明)。系統(tǒng)根據(jù)外部變量的定義(而不是根據(jù)外部變量的說明)分配存儲單元。對外部變量的初始化只能在“定義”時進行,“extern”只是申明該變量是一個已在外部定義過的變量而已。如果在同一源文件中,外部變量與局部變量同名,則在局部變量的作用范圍內(nèi),外部變量不起作用。輸出結(jié)果:10,4,810,2,5例#include"stdio.h"main(){inta=1,b=2,c=3;a++;c+=b;{intb=4,c;c=2*b;a+=c;printf("%d,%d,%d\n",a,b,c);}printf("%d,%d,%d\n",a,b,c);getch();}局部變量的存儲方式函數(shù)中的局部變量若未專門說明,這類局部變量稱為自動變量,其類型說明前不論是否有關(guān)鍵字“auto”,都屬于動態(tài)存儲類別。2)若希望被調(diào)函數(shù)在結(jié)束后,其局部變量占用的存儲空間不釋放,以便保留其變量的值,用于下次調(diào)用該函數(shù),則用“static”說明為“局部靜態(tài)變量”。
局部靜態(tài)變量
在靜態(tài)存儲區(qū)分配存儲單元,在程序的整個運行期間都不釋放。在編譯時只賦初值一次,以后每次被調(diào)用時不再重新賦值而只保留前次被調(diào)用結(jié)束時的值。若未賦初值,則在編譯時自動賦初值0(數(shù)值型)或空字符(字符型)。雖然局部靜態(tài)變量在函數(shù)被調(diào)用結(jié)束后其值仍然存在,但其它函數(shù)是不能引用的。動態(tài)變量在動態(tài)存儲區(qū)分配存儲單元,函數(shù)調(diào)用結(jié)束后即釋放。賦初值不是在編譯時而是在函數(shù)被調(diào)用時進行的,函數(shù)每次被調(diào)用時重新賦值。若未賦初值,則其值是不確定的例打印1到5的階乘值。
intfac(intn)
{
staticintf
=1;/定義f為int型靜態(tài)變量/
f=f
n;return(f);
}
main()
{
inti;
for(i=1;i<=5;i++)
printf(“%d!=%d\n”,i,fac(i));
}
根據(jù)函數(shù)是否能被其它文件所調(diào)用,分為:1.內(nèi)部函數(shù)----只能被本文件的其它函數(shù)所調(diào)用的函數(shù)定義方式如:
staticintfun(a,b);
2.外部函數(shù)----可以被其它文件所使用的函數(shù)。定義方式如:
externintfun(a,b);
如果省略extern,則隱含該函數(shù)為外部函數(shù)。6.3內(nèi)部函數(shù)和外部函數(shù)直接遞歸調(diào)用:在函數(shù)定義的語句中,存在著調(diào)用本函數(shù)的語句。
間接遞歸調(diào)用:在不同的函數(shù)定義中,存在著互相調(diào)用函數(shù)語句的情況。(P136)6.4遞歸函數(shù)的設計和調(diào)用一個函數(shù)能設計成為遞歸函數(shù),在數(shù)學上必須具備以下兩個條件:1)問題的后一部分與原始問題類似2)問題的后一部分是原始問題的簡化例6-7例6-8longfac(intn){longresult;if(n==0||n==1)result=1;elseresult=n*fac(n-1);returnresult;}main(){intn;longf;printf("Pleaseentervalueofn:\n");scanf("%d",&n);if(n<0)printf("Sorry!Youenterawrongnumber!\n");else{f=fac(n);printf("%d!=%ld\n",n,f);}}
“編譯預處理”是C與其它高級語言的一個重要區(qū)別。它們主要是:
宏定義文件包含條件編譯
6.5預處理2.帶參數(shù)的宏定義語句形式:
#define宏名(形參表)字符串注意:字符串應包含形參表中的參數(shù)例#definePI3.1415926#defineS(r)PI*r*rmain(){floata,area;a=3.6;area=S(a);/*area=3.1415926*a*a,但不會置換a為3.6*/printf("r=%f\narea=%f\n",a,area);getch();}
若將area=S(a)改寫成area=S(a+2),將置換為:
area=PI
a+2a+2,而不是:area=PI
(a+2)(a+2)。若要達到后者,則應將宏定義命令改寫為: #defineS(r)PI
(r)
(r)
宏名與括號之間不得有空格,因為宏名與表達式之間的分隔符為空格。如果用#defineS(r)PI
r
r的話,則被置換為area=(r)PI
r
r
(a)宏展開并不進行值的傳遞,即不求表達式的值,也沒有“返回值”的概念。
宏不存在類型問題,宏名無類型,參數(shù)也無類型,表達式可以是任何類型。注:這里的t展開后為t=(a+b)>(c+d)?(a+b):(c+d)如果第一行寫成:#defineMAX(x,y)x>y?x:y則這里的t展開后為t=a+b>c+d?a+b:c+d因為置換展開是用“表達式”對等的置換“形參表”中的參數(shù)。
定義帶參數(shù)的宏,可以實現(xiàn)一些簡單的函數(shù)功能。如: #defineMAX(x,y)(x)>(y)?(x):(y)
main() {inta,b,c,t;
t=MAX(a+b,c+d);
}6.5.2“文件包含”用
#include
命令實現(xiàn)一個文件包含另一個文件。語句形式:#include“文件名”例#include"stdio.h"#defineN2#defineMN+1#defineNUM(M+1)*M/2main(){inti,n=0;for(i=1;i<=NUM;i++){n++;printf("%2d",n);}getch();}輸出結(jié)果:12345678
一個include命令只能指定一個被包含文件,如果要包含n個文件,則要用n個include命令。
NUM被代換展開后為:(2+1+1)2+1/2#include命令中,文件名既可用雙引“”號(推薦),也可用尖括號<>括起來。<>表示被包含在標準目錄中(include).“”表示被包含文件在指定目錄中,若只有文件名不帶路徑,則在當前目錄中,若找不到,再到標準目錄中找。包含文件名可以是.c源文件或.頭文件,如#include<stdio.h>#include“myhead.h”#include“D:\myexam\myfile.c”6.12條件編譯
語句形式:1.#ifdef宏名 程序段1 [#else 程序段2] #endif
作用:如果宏名已定義,則編譯“程序段1”,否則編譯“程序段2”。所謂“宏名已定義”是無論“宏名”定義為什么內(nèi)容。條件編譯的作用:縮短編譯時間,減少目標程序的長度。
作用:如果宏名未定義,則編譯“程序段1”,否則編譯“程序段2”。3.#if表達式 程序段1 [#else 程序段2] #endif
作用:當“表達式”值為非0,則編譯“程序段1”,否則編譯“程序段2”。2.#ifndef宏名
程序段1
[#else
程序段2]
#endif
4.#if表達式1 程序段1 #elif表達式2 程序段2#else程序段3 #endif
作用:當“表達式1”值為非0,則編譯“程序段1”,否則判斷”表達式2”;當“表達式2”的值為真,則編譯“程序段2”,否則編譯”程序段3”。例#defineTED10main(){#ifdefTEDprintf("Hi,Ted\n");#else
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國水污染防治設備制造行業(yè)發(fā)展狀況分析及前景趨勢研究報告
- 2024-2030年中國氯堿行業(yè)競爭力策略及投資風險研究報告版
- 2022年大學化學專業(yè)大學物理二模擬考試試卷A卷-附解析
- 2022年大學電子信息科學專業(yè)大學物理下冊月考試卷-附解析
- 城市建設安全、環(huán)境保護管理制度
- 醫(yī)療機構(gòu)檢測檔案管理制度
- 2022年大學環(huán)境與安全專業(yè)大學物理下冊月考試卷-附解析
- 冀教版四年級上冊數(shù)學第七單元 垂線和平行線 測試卷及參考答案(黃金題型)
- 培訓機構(gòu)課程管理與評估制度
- 2022年大學農(nóng)業(yè)工程專業(yè)大學物理二期末考試試卷C卷-附解析
- 高校物業(yè)物業(yè)管理服務內(nèi)容及標準
- 校車發(fā)展方案
- 戲雪樂園策劃方案
- 一例新生兒NEC護理個案
- 2024年天翼云運維工程師認證考試復習題庫(含答案)
- 呼吸道疾病防控宣傳教育培訓
- 電池管理系統(tǒng)優(yōu)化
- 體育課堂數(shù)字化教學設計方案
- 2024年中鐵高新工業(yè)股份有限公司招聘筆試參考題庫含答案解析
- 中樞性面癱與周圍性面癱的區(qū)別課件
- 人行安全門通道閘機施工方案
評論
0/150
提交評論