函數(shù)是用戶與程序的接口,在定義一個(gè)函數(shù)前,首先要清楚以下三個(gè)問(wèn)題。1) 函數(shù)的功能實(shí)現(xiàn)及算法選擇。算法選擇會(huì)在后續(xù)文章詳細(xì)講解,本節(jié)重點(diǎn)關(guān)注函數(shù)的功能實(shí)現(xiàn)。一般選取能體現(xiàn)函數(shù)功能的函數(shù)名,且見(jiàn)名知意,如求和函數(shù)的函數(shù)名可取為 add,求最大值的函數(shù)名可取為 max,排序函數(shù)可取名為 sort 等。2) 需要用戶傳給該函數(shù)哪些參數(shù)、什么類型,即函數(shù)參數(shù)。3) 函數(shù)執(zhí)行完后返回給調(diào)用者的參數(shù)及類型,即函數(shù)返回值類型。 函教定義格式 函數(shù)定義的一般格式為: 返回類型 函數(shù)名 (類型參數(shù)1,類型參數(shù)2,…) {函數(shù)體 }也可以不含參數(shù),不含參數(shù)時(shí),參數(shù)表中可寫(xiě)關(guān)鍵字 void 或省略,為規(guī)范起見(jiàn),教程中對(duì)沒(méi)有參數(shù)的函數(shù),參數(shù)表中統(tǒng)一寫(xiě) void。例如: 類型 函數(shù)名 () {函數(shù)體 }等價(jià)于: 類型 函數(shù)名 (void) //建議的書(shū)寫(xiě)方式 {函數(shù)體 } 如果該函數(shù)沒(méi)有返回類型,則為 void 類型。例如: void add (int x,int y) {printf ("sum=%d\n", x+y); } 除了 void 類型外,在函數(shù)體中,均需要顯式使用 return 語(yǔ)句返回對(duì)應(yīng)的表達(dá)式的值。 函教返回值 函數(shù)的值是指調(diào)用函數(shù)結(jié)束時(shí),執(zhí)行函數(shù)體所得并返回給主調(diào)函數(shù)的值。 關(guān)于函數(shù)返回值說(shuō)明如下。1) 帶返回值的函數(shù),其值一般使用 return 語(yǔ)句返回給調(diào)用者。其格式為: return 表達(dá)式;或者 return (表達(dá)式);例如: int add (int a, int b) {return (a + b); //return 后為表達(dá)式 } 函數(shù)可以含一個(gè)或多個(gè) return 語(yǔ)句,但每次調(diào)用時(shí)只能執(zhí)行其中一個(gè) return 語(yǔ)句。例如,求整數(shù)絕對(duì)值的函數(shù): int f (int n) //含多個(gè)return語(yǔ)句,但每次調(diào)用只執(zhí)行一個(gè) {if (n = 0)return n;elsereturn -n; }
新都ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書(shū)銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書(shū)合作)期待與您的合作!
假設(shè)主函數(shù)main()。其他函數(shù)void fun(int a,int *b)。
關(guān)于函數(shù)定義和聲明:
在代碼中fun函數(shù),有完整函數(shù)體的代碼就是函數(shù)定義部分,比如void fun(int a,int *b){。。。};。
如果沒(méi)有具體實(shí)現(xiàn)的函數(shù)體代碼(也就是大括號(hào)內(nèi)容),那么就是函數(shù)聲明。比如void fun(int ,int *);
關(guān)于函數(shù)聲明和調(diào)用:
如果fun函數(shù)定義在main代碼上面。比如:
void fun(int a,int *b){。。。};
int main(){
int a=0,int b=0;
......
fun(a,b);//這里fun定義代碼在main上面,所以可以不需要聲明。反之需要先寫(xiě)聲明語(yǔ)句
return 0;
}
關(guān)于函數(shù)局部變量及全局變量:
簡(jiǎn)單區(qū)分:
定義在函數(shù)之外的就是全局變量,這個(gè)變量所有函數(shù)都可以直接使用,并且共用同一個(gè)地址。任意函數(shù)修改了變量值,其他函數(shù)調(diào)用也會(huì)變。
定義在函數(shù)之內(nèi)的就是局部變量,局部變量只屬于該函數(shù),其他函數(shù)即使定義了同樣名字的變量,這兩個(gè)變量也不同地址,互不相干。
比如:
int a;//這就是全局變量,作用域下所有函數(shù)共用
int main()
{
int b;//這就是局部變量,只在本函數(shù)有效,如果想在調(diào)用fun函數(shù)時(shí)讓fun也使用該變量,需要把這個(gè)變量的地址作為參數(shù)傳遞過(guò)去。
printf("%d",b);
return 0;
}
注意:c語(yǔ)言中允許局部變量和全局變量同名,但是同名的局部變量會(huì)屏蔽全局變量,實(shí)際代碼避免同名。
關(guān)于函數(shù)傳值和傳址:
如函數(shù)void fun(int a,int *b){..........};這里形參a 和*b,分別表示一個(gè)值和一個(gè)地址
所以在調(diào)用該函數(shù)時(shí),比如:
int main()
{
int c,d;
fun(c,d);//這里調(diào)用就對(duì)應(yīng)上面形參類型,第一個(gè)參數(shù)傳遞了c的值(傳值),第二個(gè)參數(shù)傳遞了d的地址(傳址),這里c和d,叫做實(shí)參。當(dāng)fun函數(shù)運(yùn)行時(shí)改變了a和b指向地址的值,對(duì)應(yīng)main函數(shù)中c的值不變,d的值改變。
return 0;
}
順帶一說(shuō):局部變量,在函數(shù)運(yùn)行結(jié)束后會(huì)自動(dòng)釋放,所以想把局部變量地址作為返回值,需要用malloc函數(shù)申請(qǐng)。(這里看不懂可以暫時(shí)忽視)
需要準(zhǔn)備的材料分別有:電腦、C語(yǔ)言編譯器。
1、首先,打開(kāi)C語(yǔ)言編譯器,新建一個(gè)初始.cpp文件,例如:test.cpp。
2、在test.cpp文件中,輸入C語(yǔ)言代碼:int fun(){return 1;}。
3、編譯器運(yùn)行test.cpp文件,此時(shí)成功調(diào)用fun()函數(shù)輸出了內(nèi)容。
函數(shù)聲明它為編譯器提供了有用的信息,編譯器在翻譯代碼的過(guò)程中,只有見(jiàn)到函數(shù)原型(這里即可以是聲明也可以是定義)之后才知道這個(gè)函數(shù)的名字、參數(shù)類型和返回值,這樣碰到函數(shù)調(diào)用時(shí)才知道怎么生成相應(yīng)的指令,所以函數(shù)原型必須出現(xiàn)在函數(shù)調(diào)用之前,這也是遵循“先聲明后使用”的原則。
注意上面說(shuō)的函數(shù)原型是包括函數(shù)聲明和定義兩種形式的。
另外還有一種特殊情況,就是
隱式聲明:
隱式聲明的函數(shù)返回值類型都是int;
如下
#includestdio.h
main()
{
printf("%d\n",jiec(5));
}
int jiec(int n)
{
int y=1;int i;
for(i=1;i=n;i++)
y=y*i;
return(y);
}
這個(gè)程序也是可以運(yùn)行的。主要返回值為int.