今天就跟大家聊聊有關(guān)C語(yǔ)言中有哪些函數(shù),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
成都創(chuàng)新互聯(lián)公司專(zhuān)注于企業(yè)成都全網(wǎng)營(yíng)銷(xiāo)、網(wǎng)站重做改版、溧陽(yáng)網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5技術(shù)、成都商城網(wǎng)站開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為溧陽(yáng)等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
函數(shù)的定義
函數(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ù)、什么類(lèi)型,即函數(shù)參數(shù)。
3) 函數(shù)執(zhí)行完后返回給調(diào)用者的參數(shù)及類(lèi)型,即函數(shù)返回值類(lèi)型。
函教定義格式
函數(shù)定義的一般格式為:
返回類(lèi)型 函數(shù)名 (類(lèi)型參數(shù)1,類(lèi)型參數(shù)2,…)
{
函數(shù)體
}
例如,定義一個(gè)求兩個(gè)整數(shù)之和的函數(shù),返回該和值。其函數(shù)實(shí)現(xiàn)代碼為:
int add (int x,int y){ return (x+y) ; //括號(hào)可省略}
說(shuō)明:
1) 一個(gè)函數(shù)定義包含函數(shù)頭和函數(shù)體兩部分。函數(shù)名、參數(shù)表和返回類(lèi)型這三部分一般稱(chēng)為函數(shù)頭。一對(duì)大括號(hào) {} 括起來(lái)的為函數(shù)體。
2) 函數(shù)名:符合標(biāo)識(shí)符的命名規(guī)則,最好見(jiàn)名知意。如使用 add 作為求和函數(shù)的函數(shù)名,sort 作為排序函數(shù)名。
3) 參數(shù)表:函數(shù)定義時(shí)的參數(shù)又稱(chēng)為形式參數(shù),簡(jiǎn)稱(chēng)形參??梢院幸粋€(gè)或多個(gè)參數(shù),多個(gè)形參用逗號(hào)隔開(kāi)。如下格式是錯(cuò)誤的。
int add (int x;int y) //錯(cuò)誤。函數(shù)各形參間用逗號(hào)隔開(kāi),而非分號(hào){ return x+y;}
各形式參數(shù)對(duì)應(yīng)類(lèi)型均不能省略,如下格式也是錯(cuò)誤的。
int add (int x,y) //錯(cuò)誤。形參y的類(lèi)型不能省略{ return x+y;}
也可以不含參數(shù),不含參數(shù)時(shí),參數(shù)表中可寫(xiě)關(guān)鍵字 void 或省略,為規(guī)范起見(jiàn),教程中對(duì)沒(méi)有參數(shù)的函數(shù),參數(shù)表中統(tǒng)一寫(xiě) void。例如:
類(lèi)型 函數(shù)名 ()
{
函數(shù)體
}
等價(jià)于:
類(lèi)型 函數(shù)名 (void) //建議的書(shū)寫(xiě)方式{ 函數(shù)體}
4) 在函數(shù)定義中,參數(shù)表后不能加分號(hào),如下函數(shù)定義格式是錯(cuò)誤的。
float add (float x, float y); //錯(cuò)誤。函數(shù)定義時(shí),函數(shù)頭后不能有分號(hào){ return x+y;}
5) 函數(shù)體:即函數(shù)的功能實(shí)現(xiàn)代碼部分。用一對(duì)大括號(hào) {} 括起來(lái),函數(shù)體也可以為空,即函數(shù)體內(nèi)不含任何代碼,便于以后擴(kuò)充。例如:
void fun (){}
6) 返回類(lèi)型:也稱(chēng)為函數(shù)類(lèi)型,即給調(diào)用者返回值的類(lèi)型。要求顯式指定返回類(lèi)型??梢允腔緮?shù)據(jù)類(lèi)型如 int、char、float 等,也可以是復(fù)合數(shù)據(jù)類(lèi)型,如數(shù)組類(lèi)型、指針類(lèi)型,或者是自定義類(lèi)型(結(jié)構(gòu)體類(lèi)型)。
如果返回類(lèi)型省略,一般默認(rèn)為 int 型,但不推薦這種不規(guī)范的寫(xiě)法。
如果該函數(shù)沒(méi)有返回類(lèi)型,則為 void 類(lèi)型。例如:
void add (int x,int y){ printf ("sum=%d\n", x+y);}
除了 void 類(lèi)型外,在函數(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á)式}
2) 函數(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; else return -n; //或?yàn)?return (-1 * n);}
3) 不帶返回值的函數(shù),其返回類(lèi)型一般顯式指定為 void 類(lèi)型。如 void print_99 (void); 函數(shù),其返回類(lèi)型為 void。
4) 如果沒(méi)有顯式指定函數(shù)的返回類(lèi)型,默認(rèn)為 int 型,不推薦這種不規(guī)范的寫(xiě)法。 例如:
add (int a, int b) //省略返回類(lèi)型,默認(rèn)為int型{ return (a + b);}
5) return 后表達(dá)式的類(lèi)型應(yīng)與函數(shù)返回類(lèi)型一致,如果不一致,則先將表達(dá)式的類(lèi)型自動(dòng)轉(zhuǎn)換為函數(shù)類(lèi)型后再返回。例如:
int f (void) //函數(shù)返回類(lèi)型為int{ int n = 1; return (n + 2.3); //表達(dá)式為 double 型}
上述函數(shù)中,函數(shù)類(lèi)型為 int 型,return 后表達(dá)式的類(lèi)型為 double 型值 3.3,兩者類(lèi)型不一致,故首先把表達(dá)式的類(lèi)型 double 自動(dòng)轉(zhuǎn)換為 int 型值 3,然后再把 3 作為函數(shù)返回值返回給調(diào)用者。這種情況一般會(huì)丟失精度,可能得不到預(yù)想的結(jié)果。
函教調(diào)用格式
無(wú)參函數(shù)的調(diào)用格式
函數(shù)名();
注意:無(wú)參函數(shù)調(diào)用時(shí),參數(shù)表空著,而不能寫(xiě)出 void,如下函數(shù)調(diào)用是錯(cuò)誤的。
函數(shù)名 (void);//錯(cuò)誤!無(wú)參函數(shù)調(diào)用時(shí),參數(shù)表空著,不能加void
例如,設(shè)有定義好的無(wú)參函數(shù) void print_99(void); 的調(diào)用如下。
print_99 ( ) ; //正確。調(diào)用無(wú)參函數(shù)print_99 (void) ; //錯(cuò)誤。實(shí)參表中不能加void
帶參函數(shù)的調(diào)用格式
函數(shù)名(實(shí)參1,實(shí)參2,…);
說(shuō)明:
1) 其中各實(shí)參可以是各種類(lèi)型的常量、變量或表達(dá)式。例如,對(duì)定義好的帶參函數(shù) int add (int a,int b); 的調(diào)用如下。
add (2,5+1); //正確,實(shí)參可以為常量、變量或表達(dá)式 int n=7;add(3,n); //正確,實(shí)參可以是變量
2) 調(diào)用函數(shù)時(shí),不能寫(xiě)函數(shù)類(lèi)型。
int add(2,3);//錯(cuò)誤,調(diào)用時(shí)不能加返回類(lèi)型
函教調(diào)用過(guò)程
函數(shù)調(diào)用的過(guò)程是:首先是實(shí)參給形參賦初值,接著函數(shù)體對(duì)形參做相應(yīng)處理,最后把處理結(jié)果作為函數(shù)值返回給調(diào)用者。
未被調(diào)用時(shí)的函數(shù)形參并不占用內(nèi)存空間,在函數(shù)調(diào)用時(shí)為形參變量分配空間,把實(shí)參的值賦給對(duì)應(yīng)形參變量的空間,函數(shù)調(diào)用結(jié)束時(shí),收回分配給形參的內(nèi)存空間。即形參僅在函數(shù)調(diào)用的過(guò)程中占有內(nèi)存空間。
通過(guò)如下 add 函數(shù)來(lái)說(shuō)明函數(shù)調(diào)用過(guò)程。
//函數(shù)定義int add (int a, int b) int s; s=a+b; return s;}
說(shuō)明:
1) 以上是 add 函數(shù)的定義,a 和 b 為形參,s 為函數(shù)內(nèi)定義變量,a、b、s 這三個(gè)變量均為局部變量,作用域?yàn)樵摵瘮?shù),不能在 add 函數(shù)外使用。
2) 未調(diào)用 add 函數(shù)時(shí),a、b 和 s 均不占用內(nèi)存空間。函數(shù)調(diào)用時(shí),即執(zhí)行如下語(yǔ)句。
int x=2, y=3, sum;sum=add(x,y);
該函數(shù)調(diào)用語(yǔ)句中,有兩個(gè)實(shí)參,第一個(gè)實(shí)參為 x,其值為 2,第二個(gè)實(shí)參為 y,其值為 3。在函數(shù)調(diào)用時(shí),為形參 a 和 b 及函數(shù)內(nèi)變量 s 這三個(gè)整型局部變量分配存儲(chǔ)空間,在 VC++ 6.0 里各占 4 個(gè)字節(jié)。
函數(shù)調(diào)用過(guò)程也就是實(shí)參給形參賦初值的過(guò)程,即:
a=x;b=y;
函數(shù)體中,對(duì)形參 a 和 b 求和的結(jié)果賦給 s,最后把 s 的值作為函數(shù)的值返回賦給 sum 變量。調(diào)用過(guò)程結(jié)束,函數(shù) add 中的所有局部變量的內(nèi)存空間被收回。
由于形參僅在定義函數(shù)內(nèi)有效,故在函數(shù)調(diào)用時(shí),函數(shù)的實(shí)參可以和形參變量同名,互不影響。
函教原型聲明
函數(shù)原型包括返回類(lèi)型、函數(shù)名、參數(shù)列表等函數(shù)定義的基本信息。一般用于告知調(diào)用者該函數(shù)的基本信息,便于調(diào)用。
函數(shù)原型聲明通常有以下兩種形式。
無(wú)參函數(shù)原型聲明格式為:
返回類(lèi)型 函數(shù)名 (void);
或者
返回類(lèi)型 函數(shù)名 ();
帶參函數(shù)原型聲明通常有如下兩種形式。
1) 返回類(lèi)型 函數(shù)名 (類(lèi)型參數(shù) 1,類(lèi)型參數(shù) 2,…);
這種寫(xiě)法是把函數(shù)定義時(shí)的函數(shù)頭直接復(fù)制過(guò)來(lái)加分號(hào)即可,在編程時(shí),操作方便,較節(jié)省時(shí)間,例如:
int add (int a, int b); //正確,函數(shù)頭后面直接加分號(hào)
2) 返回類(lèi)型 函數(shù)名 (類(lèi)型,類(lèi)型,…);
這種寫(xiě)法在第一種寫(xiě)法的基礎(chǔ)上,去掉了各個(gè)形參名,只保留各個(gè)形參類(lèi)型。這種寫(xiě)法比較專(zhuān)業(yè),但可能多花費(fèi)些時(shí)間。例如:
int add (int, int);//正確,只指明有兩個(gè)整型形參即可
如果把函數(shù)定義的代碼寫(xiě)在了調(diào)用語(yǔ)句之前,在這種情況下,雖然不加函數(shù)原型聲明,也可以正常調(diào)用函數(shù)。但為了規(guī)范起見(jiàn),要求所有定義函數(shù),在函數(shù)調(diào)用前必須加函數(shù)原型聲明語(yǔ)句。
比較常見(jiàn)規(guī)范的函數(shù)使用方式是:先函數(shù)原型聲明,再調(diào)用,一般函數(shù)定義在程序的后面。
說(shuō)明:函數(shù)原型聲明,原則上只要在函數(shù)調(diào)用前聲明都可以,但為了不讓 main 函數(shù)顯得臃腫,一般不放在main函數(shù)里面,比較規(guī)范的做法是把其放在 main 函數(shù)前面。本書(shū)采用這種方式。
函教調(diào)用舉例
【例 1】帶參函數(shù)調(diào)用舉例。設(shè)計(jì)一個(gè)求兩個(gè)整型數(shù)之和的函數(shù)。
問(wèn)題分析:
1) 欲求兩個(gè)整型數(shù)之和,調(diào)用者必須傳遞給該函數(shù)兩個(gè)整型數(shù),故函數(shù)需要兩個(gè)整型類(lèi)型的“容器”即形參,用于接收調(diào)用者傳來(lái)的兩個(gè)整型數(shù)。因?qū)崿F(xiàn)功能為求和運(yùn)算,函數(shù)名可取為 add,把求和的結(jié)果(整型)返回給調(diào)用者,即返回值類(lèi)型也為整型。
2) 函數(shù)調(diào)用之前必須聲明函數(shù)原型,一般放在 main 函數(shù)前面。
3) 函數(shù)調(diào)用時(shí),把欲求和的被加數(shù)和加數(shù)作為實(shí)參傳遞給函數(shù)形參。
4) 函數(shù)的返回值即求和的結(jié)果,可以直接輸出,或保存到某變量中參與其他運(yùn)算或輸出。
實(shí)現(xiàn)代碼:
#includeint add (int a, int b); //函數(shù)聲明int main (void){ int a=2,b=3, s; s=add(a,b); //函數(shù)調(diào)用,返回值賦給s printf("%d+%d=%d\n",a,b,s); return 0;}int add (int a, int b) //函數(shù)定義{ int s; s=a+b; return s;}
運(yùn)行結(jié)果為:
2+3=5
【例 2】無(wú)參函數(shù)調(diào)用舉例,編寫(xiě)一個(gè)打印九九乘法表的函數(shù)。
分析:該函數(shù)根據(jù)實(shí)現(xiàn)的功能可取名為 Print_99,該函數(shù)不需要調(diào)用者(main 函數(shù))向其傳遞任何參數(shù),該函數(shù)就可以正常打印九九乘法表,故該函數(shù)可以定義為無(wú)參類(lèi)型。
實(shí)現(xiàn)代碼:
#includevoid print_99 (void);//函數(shù)聲明int main (void){ print_99();//無(wú)參函數(shù)調(diào)用 return 0;}void print_99 (void) //無(wú)參函數(shù)定義{ int i, j; for(i=1;i<=9;i++) { for (j=1; j<=i; j++) printf("%d*%d=%d\t",i,j,i*j); printf ("\n"); }} 運(yùn)行結(jié)果: 1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 函數(shù)的嵌套調(diào)用
在 C 語(yǔ)言中,函數(shù)不能嵌套定義,即不能在一個(gè)函數(shù)中定義其他函數(shù)。例如,在 main 函數(shù)中嵌套定義函數(shù) fun,為錯(cuò)誤語(yǔ)法。
int main (void){ int fun(void)//錯(cuò)誤,不能嵌套定義 { //fun函數(shù)體 } //... return 0;}
此代碼就屬于函數(shù)的嵌套定義,是錯(cuò)誤的語(yǔ)法。
C 語(yǔ)言雖然不支持函數(shù)的嵌套定義,但支持函數(shù)的嵌套調(diào)用,即在一個(gè)函數(shù)中可以調(diào)用其他函數(shù),在前面已經(jīng)涉及函數(shù)嵌套調(diào)用,就是在main函數(shù)中調(diào)用其他自定義函數(shù)。自定義函數(shù)之間也可以相互嵌套調(diào)用。
【例 3】編程實(shí)現(xiàn)求 12+22+32+42+52+...+102 的值
實(shí)現(xiàn)代碼為:
#includeint pow(int , int);int sum(int);int main(void){ int r; r=sum(10); printf("result=%d\n",r); return 0;}int sum(int n){ int i,s=0; for(i=1;i<=n;i++) { s+=pow(i,2); } return s;}int pow(int m,int n){ int i,p=1; for(i=1;i<=n;i++) { p*=m; } return p;} 運(yùn)行結(jié)果為: result=385 程序說(shuō)明:該程序的執(zhí)行過(guò)程是,操作系統(tǒng)調(diào)用 main 函數(shù),main 函數(shù)調(diào)用 sum 函數(shù),sum 函數(shù)調(diào)用 pow 函數(shù),pow 函數(shù)執(zhí)行完后,返回到其調(diào)用者 sum 函數(shù),接著往下執(zhí)行,sum 函數(shù)執(zhí)行完,返回調(diào)用處 main 函數(shù),接著往下執(zhí)行,執(zhí)行完 main 函數(shù),return 0; 后返回給操作系統(tǒng),整個(gè)程序執(zhí)行結(jié)束。 另外,sum 函數(shù)及 pow 函數(shù)中均含有相同名字的變量 n 和 i。因?yàn)樗鼈兌际蔷植孔兞浚饔糜騼H局限于各自的函數(shù)體中,故它們互不相干,互不影響。 傳值調(diào)用和傳址調(diào)用
C 語(yǔ)言中函數(shù)調(diào)用方式可分為傳值調(diào)用和傳址調(diào)用兩大類(lèi)。
傳值調(diào)用
函數(shù)調(diào)用時(shí),把實(shí)參的值傳遞給對(duì)應(yīng)形參變量。這種調(diào)用形式,相當(dāng)于形參復(fù)制了實(shí)參的一個(gè)副本,函數(shù)體內(nèi)對(duì)形參(實(shí)參的副本)操作,形參變量的變化并不會(huì)影響到實(shí)參的值。即函數(shù)調(diào)用過(guò)程中,數(shù)據(jù)的傳遞是單向的。
傳值調(diào)用時(shí),傳入的實(shí)參是普通變量(包括數(shù)組的某個(gè)元素)和常量及常量表達(dá)式。
例如,分析如下程序。
#includevoid swap (int, int);int main (void){ int a=3, b=5; swap(a,b); printf ("a=%d,b=%d\n",a,b); return 0;}void swap (int x, int y){ int t; t=x; x=y; y=t;}
【運(yùn)行結(jié)果】
a=3,b=5
程序分析:
形參為普通變量(整型),實(shí)參為普通變量(整型變量 a 和 b),故該函數(shù)調(diào)用為傳值調(diào)用。形參相當(dāng)于復(fù)制了實(shí)參的一個(gè)副本,函數(shù)內(nèi)對(duì)形參的操作,均是對(duì)實(shí)參副本的操作,不會(huì)對(duì)實(shí)參變量產(chǎn)生任何影響。
另外,swap 函數(shù)中借助于變量 t,把形參 x 和 y 的值進(jìn)行交換,由于 x、y 和 t 均屬于 swap 函數(shù)內(nèi)的局部變量,函數(shù)調(diào)用結(jié)束后,三個(gè)變量的空間全收回,對(duì)實(shí)參變量 a 和 b 沒(méi)有任何影響。故調(diào)用該函數(shù)后,a 和 b 的值并未發(fā)生交換。
傳址調(diào)用
實(shí)參是某個(gè)空間的地址,把該地址賦給形參變量,函數(shù)內(nèi)對(duì)該地址操作,可間接對(duì)該地址所指的空間進(jìn)行操作。即傳址調(diào)用過(guò)程,函數(shù)可以通過(guò)傳入的地址值,改變?cè)摰刂房臻g的值。數(shù)組作為函數(shù)參數(shù)和指針作為函數(shù)參數(shù)均可實(shí)現(xiàn)址調(diào)用。
傳址調(diào)用時(shí),實(shí)參為地址(一維數(shù)組名被看成數(shù)組首元素的地址)。形參一般為數(shù)組類(lèi)型或指針類(lèi)型。如果形參為數(shù)組類(lèi)型,則實(shí)參為同類(lèi)型數(shù)組的數(shù)組名或首元素的地址。
例如,用數(shù)組類(lèi)型作函數(shù)形參,編程實(shí)現(xiàn)求斐波那契數(shù)列的前 n 項(xiàng)的程序。實(shí)現(xiàn)代碼為:
#include#define N 10void Fib (int x[], int n);int main (void){ int i,a[N] = {0,1}; Fib(a,N); for(i=0;i
運(yùn)行結(jié)果:
0 1 1 2 3 5 8 13 21 34
看完上述內(nèi)容,你們對(duì)C語(yǔ)言中有哪些函數(shù)有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。