版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
函數(shù)函數(shù)概述函數(shù)概述一個較大的程序可分為若干個程序模塊,每一個模塊用來實現(xiàn)一個特定的功能。對于較大的程序,通常將程序內(nèi)容分別放在若干個源文件中,再由若干源程序文件組成一個C程序。這樣便于分別編寫、分別編譯,提高調(diào)試效率。一個源程序文件可以為多個C程序公用。C語言中,各個模塊的功能通常采用子程序的形式來實現(xiàn),而子程序一般又是通過函數(shù)來實現(xiàn)的。所有函數(shù)都是平行的,即在定義函數(shù)時是分別進(jìn)行的,是互相獨立的。一個函數(shù)并不從屬于另一函數(shù),即函數(shù)不能嵌套定義。一個C程序可由一個主函數(shù)和若干個其他函數(shù)構(gòu)成。函數(shù)間可以互相調(diào)用,但不能調(diào)用main函數(shù)。main函數(shù)是由系統(tǒng)調(diào)用的。其他函數(shù)只能由主函數(shù)調(diào)用執(zhí)行。其他函數(shù)也可以互相調(diào)用。同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次。函數(shù)的分類從用戶角度標(biāo)準(zhǔn)函數(shù)(庫函數(shù)):由系統(tǒng)提供用戶自定義函數(shù)從函數(shù)形式無參函數(shù)有參函數(shù)使用庫函數(shù)應(yīng)注意:1、函數(shù)的功能2、函數(shù)參數(shù)的數(shù)目、順序及各參數(shù)意義和類型3、函數(shù)返回值的意義和類型4、需要使用的包含文件函數(shù)的定義一般格式合法的標(biāo)識符函數(shù)返回值類型。缺省int型,無返回值void函數(shù)體函數(shù)類型函數(shù)名(形參類型說明表){
說明部分 語句部分}例有參函數(shù)
int
max(int
x,inty){intz;z=x>y?x:y;return(z);}例有參函數(shù)
int
max(intx,y){intz;z=x>y?x:y;return(z);}例空函數(shù)
dummy(){}函數(shù)體為空例無參函數(shù)
printstar(){printf(“**********\n”);}
或
printstar(void){printf(“**********\n”);}函數(shù)的返回值返回語句形式:return(表達(dá)式);return表達(dá)式;
return;功能:使程序控制從被調(diào)函數(shù)返回到主調(diào)函數(shù)中,同時把返值帶給主調(diào)函數(shù)說明:函數(shù)中也可以有多個return語句若無return語句,遇最后一個“}”時,自動返回調(diào)用函數(shù)凡不加類型說明的函數(shù),自動按整型處理。對于不帶回值的函數(shù),應(yīng)當(dāng)用“void”定義函數(shù)為“無類型”(或稱“空類型”)。此時在函數(shù)體中不得出現(xiàn)return語句。對于不帶回值的函數(shù),應(yīng)當(dāng)用“void”定義函數(shù)為“無類型”(或稱“空類型”)。此時在函數(shù)體中不得出現(xiàn)return語句。例無返回值函數(shù)
void
swap(int
x,inty){inttemp;temp=x;x=y;y=temp;}若函數(shù)類型與return語句中表達(dá)式值的類型不一致,將自動轉(zhuǎn)換為函數(shù)類型(調(diào)用轉(zhuǎn)換)main(){int
max(float
a,floatb);
intc;
scanf("%f,%f",&a,&b);c=max(a,b);
printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;
return(z);}函數(shù)的調(diào)用調(diào)用形式
函數(shù)名(實參表);調(diào)用方式函數(shù)語句:如printstar();函數(shù)表達(dá)式:如m=max(a,b)*2;函數(shù)參數(shù):如printf(“%d”,max(a,b));m=max(a,max(b,c));說明:實參與形參個數(shù)相等,類型一致,按順序一一對應(yīng)如果實參表列包括多個實參,對實參求值的順序并不是確定的,有的系統(tǒng)按自左至右順序求實參的值,有的系統(tǒng)則按自右至左順序。#include<stdio.h>voidmain(){int
f(int
a,intb);/*函數(shù)聲明*/
inti=2,p;p=f(i,++i);/*函數(shù)調(diào)用*/
printf("%d\n",p);}int
f(int
a,intb)/*函數(shù)定義*/{intc;
if(a>b)c=1;elseif(a==b)c=0;elsec=-1;
return(c);}
如果按自左至右順序求實參的值,則函數(shù)調(diào)用相當(dāng)于f(2,3)如果按自左至右順序求實參的值,則函數(shù)調(diào)用相當(dāng)于f(3,3)例:參數(shù)求值順序(運行結(jié)果在不同編譯系統(tǒng)中可能不同)main(){inti=2,p;p=f(i,++i);
printf("%d",p);}int
f(inta,intb){intc;
if(a>b)c=1;elseif(a==b)c=0;elsec=-1;
return(c);}main(){inti=2,p;p=f(i,i++);
printf("%d",p);}int
f(inta,intb){intc;
if(a>b)c=1;elseif(a==b)c=0;elsec=-1;
return(c);}運行結(jié)果:0運行結(jié)果:1函數(shù)的說明如果使用用戶自己定義的函數(shù),而該函數(shù)的位置在主調(diào)函數(shù)的后面,應(yīng)該在主調(diào)函數(shù)中對被調(diào)用的函數(shù)作聲明。一般形式:函數(shù)類型函數(shù)名(形參類型[形參名],…..);或函數(shù)類型函數(shù)名();作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個數(shù)及類型,以便檢驗函數(shù)說明的位置:程序的數(shù)據(jù)說明部分(函數(shù)內(nèi)或外)TC中,下列情況可不作函數(shù)說明若函數(shù)返值是char或int型被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前函數(shù)說明舉例1main(){floatadd(float,float);floata,b,c;
scanf("%f,%f",&a,&b);c=add(a,b);
printf("sumis%f",c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}floatadd();函數(shù)說明舉例2floatadd(floatx,floaty){floatz;z=x+y;return(z);}main(){floata,b,c;
scanf("%f,%f",&a,&b);c=add(a,b);
printf("sumis%f",c);}被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前,不必函數(shù)說明函數(shù)說明舉例3main(){floata,b;
intc;
scanf("%f,%f",&a,&b);c=max(a,b);
printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;return(z);}int型函數(shù)可不作函數(shù)說明(BorlandC++不行)函數(shù)的“定義”和“說明”的區(qū)別:函數(shù)的定義是指對函數(shù)功能的確立,包括指定函數(shù)名,函數(shù)值類型、形參及其類型、函數(shù)體等,它是一個完整的、獨立的函數(shù)單位。函數(shù)的聲明的作用則是把函數(shù)的名字、函數(shù)類型以及形參的類型、個數(shù)和順序通知編譯系統(tǒng),以便在調(diào)用該函數(shù)時系統(tǒng)按此進(jìn)行對照檢查。函數(shù)參數(shù)及其傳遞方式主調(diào)函數(shù)和被調(diào)用函數(shù)之間具有數(shù)據(jù)傳遞的關(guān)系。在不同的函數(shù)之間傳遞數(shù)據(jù),可以使用的方法有:參數(shù):通過形式參數(shù)和實際參數(shù)返回值:用return語句返回計算結(jié)果全局變量:外部變量形參:定義函數(shù)時函數(shù)名后面括號中的變量名實參:調(diào)用函數(shù)時函數(shù)名后面括號中的表達(dá)式說明:形參與實參應(yīng)類型一致或賦值兼容,個數(shù)相同若形參與實參類型不一致,自動按形參類型轉(zhuǎn)換,函數(shù)只有在調(diào)用時才為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存即釋放例比較兩個數(shù)并輸出大者main(){inta,b,c;
scanf("%d,%d",&a,&b);c=max(a,b);
printf("Maxis%d",c);}max(intx,inty){intz;z=x>y?x:y;return(z);}形參實參例:計算x的立方#include<stdio.h>floatcube(floatx){return(x*x*x);}main(){floata,p;
printf("Pleaseinputvalueofa:");
scanf("%f",&a);p=cube(a);
printf(”Cubeof%.4fis%.4f\n",a,p);}函數(shù)參數(shù)的傳值方式屬于值傳遞方式實參向形參的數(shù)據(jù)傳遞是單向“值傳遞”,只能由實參傳給形參,而不能由形參傳回來給實參。函數(shù)在調(diào)用時,首先為形參分配存儲單元,并將實參的值復(fù)制到形參中;調(diào)用結(jié)束,形參單元被釋放,實參單元仍保留并維持原值值傳遞的特點:形參與實參占用不同的內(nèi)存單元單向傳遞例:交換兩個數(shù)#include<stdio.h>main(){intx=7,y=11;
printf("x=%d,\ty=%d\n",x,y);
printf("swapped:\n");
swap(x,y);
printf("x=%d,\ty=%d\n",x,y);}swap(int
a,intb){inttemp;temp=a;a=b;b=temp;}711x:y:調(diào)用前:調(diào)用結(jié)束:711x:y:調(diào)用:711a:b:711x:y:Swap:711x:y:117a:b:temp局部變量(內(nèi)部變量)定義:在一個函數(shù)內(nèi)部定義的變量稱內(nèi)部變量。它只在本函數(shù)范圍內(nèi)有效,即:只有在本函數(shù)內(nèi)才能使用這些變量,故稱為“局部變量”。說明:主函數(shù)中定義的變量只在主函數(shù)中有效,而不因為在主函數(shù)中定義而在整個文件或程序中有效。主函數(shù)也不能使用其他函數(shù)中定義的變量。
不同函數(shù)中可以使用相同名字的變量,它們代表不同的對象,互不干擾。
形式參數(shù)也是局部變量。在一個函數(shù)內(nèi)部,可以在復(fù)合語句中定義變量,這些變量只在本復(fù)合語句中有效,這種復(fù)合語句也稱為“分程序”或“程序塊”。例:不同函數(shù)中的變量可以同名main(){inta,b;a=3;b=4;
printf("main:a=%d,b=%d\n",a,b);sub();
printf("main:a=%d,b=%d\n",a,b);}sub(){inta,b;a=6;b=7;
printf("sub:a=%d,b=%d\n",a,b);}運行結(jié)果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4例:可以在復(fù)合語句中定義變量#include<stdio.h>main(){ inti;
for(i=1;i<=10;i++) { staticcharj='A';
printf("%c:%d",j++,i); }}變量j只能在for循環(huán)語句的循環(huán)體內(nèi)被調(diào)用全局變量(外部變量)定義:函數(shù)之外定義的變量稱為外部變量。外部變量可以為本文件中其他函數(shù)所共用。它的有效范圍為從定義變量的位置開始到本源文件結(jié)束。所以也稱全程變量。應(yīng)盡量少使用全局變量,因為:全局變量在程序全部執(zhí)行過程中都占用著存儲單元降低了函數(shù)的通用性、可靠性,可移植性降低程序清晰性,容易出錯#include<stdio.h>#defineN10floatMax=0,Min=0;/*全局變量*/floataverage(floatarray[])/*定義子函數(shù),形參為數(shù)組*/{ inti; floatsum=0; Max=Min=array[0];
for(i=0;i<N;i++) { if(array[i]>Max)Max=array[i]; elseif(array[i]<Min)Min=array[i]; sum=sum+array[i]; }
return(sum/N);}voidmain(){ floatave,score[N];
inti;
for(i=0;i<N;i++)
scanf("%f",&score[i]);
ave=average(score);
printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",Max,Min,ave);}外部變量與局部變量同名問題#include<stdio.h>inta=3,b=5;/*a,b為外部變量*/voidmain(){inta=8;/*a為局部變量*/
printf("%d",max(a,b));/*全局變量b的作用范圍*/}max(int
a,intb)/*a,b為局部變量*/{intc;c=a>b?a:b;/*形參a、b作用范圍*/
return(c);}運行結(jié)果為
8
變量的存儲類別從變量的作用域角度來分,可以分為全局變量和局部變量。從變量值存在的時間角度來分,又可以分為靜態(tài)存儲方式和動態(tài)存儲方式。靜態(tài)存儲方式:指在程序運行期間由系統(tǒng)分配固定的存儲空間的方式。動態(tài)存儲方式:則是在程序運行期間根據(jù)需要進(jìn)行動態(tài)的分配存儲空間的方式。存儲空間可以分為三部分:1.程序區(qū)2.靜態(tài)存儲區(qū)3.動態(tài)存儲區(qū)變量的存儲類別變量和函數(shù)有兩個屬性:數(shù)據(jù)類型和數(shù)據(jù)的存儲類別。存儲類別指的是數(shù)據(jù)在內(nèi)存中存儲的方式。根據(jù)變量的存儲類別,我們可以知道變量的作用域和生存期。C語言中變量的存儲類別包含:自動的(auto);靜態(tài)的(static);寄存器的(register);外部的(extern)。auto變量不專門聲明存儲類別的局部變量都是自動變量。函數(shù)中的形參和在函數(shù)中定義的變量(包括在復(fù)合語句中定義的變量),都屬此類。自動變量可用關(guān)鍵字auto作存儲類別的聲明。例如:int
f(int
a)/*定義f函數(shù),a為形參*/{autoint
b,c=3;/*定義b、c為自動變量*/
……}用static聲明局部變量用關(guān)鍵字static進(jìn)行聲明的變量被稱為靜態(tài)局部變量。靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后并不立即消失,而是繼續(xù)保留原值直到程序結(jié)束。說明:靜態(tài)局部變量屬于靜態(tài)存儲類別,在靜態(tài)存儲區(qū)內(nèi)分配存儲單元。在程序整個運行期間都不釋放。靜態(tài)局部變量是在編譯時賦初值的,即只賦初值一次,以后每次調(diào)用函數(shù)時不再重新賦初值而只是保留上次函數(shù)調(diào)用結(jié)束時的值。對靜態(tài)局部變量來說,在定義時不賦初值的話,編譯系統(tǒng)會自動為其賦初值,對數(shù)值型變量賦0值,對字符變量賦空值。雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其他函數(shù)不能引用它??疾祆o態(tài)局部變量的值#include<stdio.h>voidmain(){ voidf(int);
inta=1,i;
for(i=0;i<3;i++)f(a);}voidf(inta){ autointb=1; staticintc=1; b++; c++;
printf("a=%db=%dc=%d\n",a,b,c);}運行結(jié)果為a=1b=2c=2a=1b=2c=3a=1b=2c=4register變量變量的值是存放在內(nèi)存中的。當(dāng)程序中用到哪一個變量的值時,由控制器發(fā)出指令將內(nèi)存中該變量的值送到運算器中。經(jīng)過運算后,再從運算器將數(shù)據(jù)送到內(nèi)存存放。如果一個變量使用頻繁,則為存取變量的值要花費不少時間。為提高執(zhí)行效率,C語言允許將局部變量的值放在CPU中的寄存器中,需要用時直接從寄存器取出參加運算,不必再到內(nèi)存中去存取。由于對寄存器的存取速度遠(yuǎn)高于對內(nèi)存的存取速度,因此這樣做可以提高執(zhí)行效率。以上描述的這種變量叫做寄存器變量,用關(guān)鍵字register作聲明。
使用寄存器變量,求n的階乘#include<stdio.h>voidmain(){ longfac(long); longn;
scanf("%ld",&n);
printf("%ld!=%ld\n",n,fac(n));}longfac(longn){ registerlongi,f=1;/*定義寄存器變量*/ for(i=1;i<=n;i++) f*=i; return(f);}用extern聲明外部變量外部變量是在函數(shù)的外部定義的全局變量,
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 口才培訓(xùn)試講課件模板
- 2025年吳忠市國企考試真題
- 安砌側(cè)石施工方案
- 林業(yè)旅游培訓(xùn)
- 2026內(nèi)蒙古赤峰市教育科學(xué)研究中心競爭性比選高中教研員20人備考題庫及參考答案詳解一套
- 2026年福建省泉州市鯉城區(qū)第五實驗幼兒園招聘備考題庫及一套完整答案詳解
- 2026廣西北海市鐵山港區(qū)自然資源局招聘2人備考題庫及答案詳解參考
- 2026廣東省鹽業(yè)集團(tuán)礦鹽有限公司招聘財務(wù)負(fù)責(zé)人1人備考題庫及答案詳解1套
- 2026北京市平谷區(qū)農(nóng)業(yè)中關(guān)村發(fā)展中心招聘2人備考題庫及完整答案詳解
- 2025福建福州濱海實驗學(xué)校臨聘教師招聘2人備考題庫及1套參考答案詳解
- 2026年溫州市1.5模高三語文試題作文題目解析及3篇范文:打扮自己與打扮大地
- 2026年湘西民族職業(yè)技術(shù)學(xué)院單招職業(yè)技能筆試參考題庫含答案解析
- 2025-2026學(xué)年教科版(新教材)小學(xué)科學(xué)三年級下冊《昆蟲的一生》教學(xué)設(shè)計
- 2025年12月福建廈門市鷺江創(chuàng)新實驗室管理序列崗位招聘8人參考題庫附答案
- 化工工藝安全管理與操作手冊
- 規(guī)范外匯交易管理制度
- 2026年美麗中國全國國家版圖知識競賽考試題庫(含答案)
- 高考英語讀后續(xù)寫技巧總結(jié)
- 2025年下半年河南鄭州市住房保障和房地產(chǎn)管理局招聘22名派遣制工作人員重點基礎(chǔ)提升(共500題)附帶答案詳解
- 維修事故協(xié)議書
- 2025ESC+EAS血脂管理指南要點解讀課件
評論
0/150
提交評論