C語言自定義函數(shù)的實(shí)現(xiàn)
函數(shù)是一段可以重復(fù)使用的代碼,用來獨(dú)立地完成某個(gè)功能,它可以接收用戶傳遞的數(shù)據(jù),也可以不接收。接收用戶數(shù)據(jù)的函數(shù)在定義時(shí)要指明參數(shù),不接收用戶數(shù)據(jù)的不需要指明,根據(jù)這一點(diǎn)可以將函數(shù)分為有參函數(shù)和無參函數(shù)。
將代碼段封裝成函數(shù)的過程叫做函數(shù)定義。
C語言無參函數(shù)的定義
如果函數(shù)不接收用戶傳遞的數(shù)據(jù),那么定義時(shí)可以不帶參數(shù)。如下所示:
dataType functionName(){
//body
}
- dataType 是返回值類型,它可以是C語言中的任意數(shù)據(jù)類型,例如 int、float、char 等。
- functionName 是函數(shù)名,它是標(biāo)識(shí)符的一種,命名規(guī)則和標(biāo)識(shí)符相同。函數(shù)名后面的括號(hào)( )不能少。
- body 是函數(shù)體,它是函數(shù)需要執(zhí)行的代碼,是函數(shù)的主體部分。即使只有一個(gè)語句,函數(shù)體也要由{ }包圍。
- 如果有返回值,在函數(shù)體中使用 return 語句返回。return 出來的數(shù)據(jù)的類型要和 dataType 一樣。
例如,定義一個(gè)函數(shù),計(jì)算從 1 加到 100 的結(jié)果:
int sum(){
int i, sum=0;
for(i=1; i<=100; i++){
sum+=i;
}
return sum;
}
累加結(jié)果保存在變量sum中,最后通過return語句返回。sum 是 int 型,返回值也是 int 類型,它們一一對(duì)應(yīng)。
return是C語言中的一個(gè)關(guān)鍵字,只能用在函數(shù)中,用來返回處理結(jié)果。
將上面的代碼補(bǔ)充完整:
#include <stdio.h>
int sum(){
int i, sum=0;
for(i=1; i<=100; i++){
sum+=i;
}
return sum;
}
int main(){
int a = sum();
printf("The sum is %d\n", a);
return 0;
}
運(yùn)行結(jié)果:
The sum is 5050
函數(shù)不能嵌套定義,main 也是一個(gè)函數(shù)定義,所以要將 sum 放在 main 外面。函數(shù)必須先定義后使用,所以 sum 要放在 main 前面。
注意:main 是函數(shù)定義,不是函數(shù)調(diào)用。當(dāng)可執(zhí)行文件加載到內(nèi)存后,系統(tǒng)從 main 函數(shù)開始執(zhí)行,也就是說,系統(tǒng)會(huì)調(diào)用我們定義的 main 函數(shù)。
無返回值函數(shù)
有的函數(shù)不需要返回值,或者返回值類型不確定(很少見),那么可以用 void 表示,例如:
void hello(){
printf ("Hello,world \n");
//沒有返回值就不需要 return 語句
}
void是C語言中的一個(gè)關(guān)鍵字,表示“空類型”或“無類型”,絕大部分情況下也就意味著沒有 return 語句。
C語言有參函數(shù)的定義
如果函數(shù)需要接收用戶傳遞的數(shù)據(jù),那么定義時(shí)就要帶上參數(shù)。如下所示:
dataType functionName( dataType1 param1, dataType2 param2 ... ){
//body
}
dataType1 param1, dataType2 param2 ...是參數(shù)列表。函數(shù)可以只有一個(gè)參數(shù),也可以有多個(gè),多個(gè)參數(shù)之間由,分隔。參數(shù)本質(zhì)上也是變量,定義時(shí)要指明類型和名稱。與無參函數(shù)的定義相比,有參函數(shù)的定義僅僅是多了一個(gè)參數(shù)列表。
數(shù)據(jù)通過參數(shù)傳遞到函數(shù)內(nèi)部進(jìn)行處理,處理完成以后再通過返回值告知函數(shù)外部。
更改上面的例子,計(jì)算從 m 加到 n 的結(jié)果:
int sum(int m, int n){
int i, sum=0;
for(i=m; i<=n; i++){
sum+=i;
}
return sum;
}
參數(shù)列表中給出的參數(shù)可以在函數(shù)體中使用,使用方式和普通變量一樣。
調(diào)用 sum() 函數(shù)時(shí),需要給它傳遞兩份數(shù)據(jù),一份傳遞給 m,一份傳遞給 n。你可以直接傳遞整數(shù),例如:
int result = sum(1, 100); //1傳遞給m,100傳遞給n
也可以傳遞變量:
int begin = 4; int end = 86; int result = sum(begin, end); //begin傳遞給m,end傳遞給n
也可以整數(shù)和變量一起傳遞:
int num = 33; int result = sum(num, 80); //num傳遞給m,80傳遞給n
函數(shù)定義時(shí)給出的參數(shù)稱為形式參數(shù),簡(jiǎn)稱形參;函數(shù)調(diào)用時(shí)給出的參數(shù)(也就是傳遞的數(shù)據(jù))稱為實(shí)際參數(shù),簡(jiǎn)稱實(shí)參。函數(shù)調(diào)用時(shí),將實(shí)參的值傳遞給形參,相當(dāng)于一次賦值操作。
原則上講,實(shí)參的類型和數(shù)目要與形參保持一致。如果能夠進(jìn)行自動(dòng)類型轉(zhuǎn)換,或者進(jìn)行了強(qiáng)制類型轉(zhuǎn)換,那么實(shí)參類型也可以不同于形參類型,例如將 int 類型的實(shí)參傳遞給 float 類型的形參就會(huì)發(fā)生自動(dòng)類型轉(zhuǎn)換。
將上面的代碼補(bǔ)充完整:
#include <stdio.h>
int sum(int m, int n){
int i, sum=0;
for(i=m; i<=n; i++){
sum+=i;
}
return sum;
}
int main(){
int begin = 5, end = 86;
int result = sum(begin, end);
printf("The sum from %d to %d is %d\n", begin, end, result);
return 0;
}
運(yùn)行結(jié)果:
The sum from 5 to 86 is 3731
定義 sum() 時(shí),參數(shù) m、n 的值都是未知的;調(diào)用 sum() 時(shí),將 begin、end 的值分別傳遞給 m、n,這和給變量賦值的過程是一樣的,它等價(jià)于:
m = begin; n = end;
函數(shù)不能嵌套定義
強(qiáng)調(diào)一點(diǎn),C語言不允許函數(shù)嵌套定義;也就是說,不能在一個(gè)函數(shù)中定義另外一個(gè)函數(shù),必須在所有函數(shù)之外定義另外一個(gè)函數(shù)。main() 也是一個(gè)函數(shù)定義,也不能在 main() 函數(shù)內(nèi)部定義新函數(shù)。
下面的例子是錯(cuò)誤的:
#include <stdio.h>
void func1(){
printf("http://c.biancheng.net");
void func2(){
printf("C語言小白變怪獸");
}
}
int main(){
func1();
return 0;
}
有些初學(xué)者認(rèn)為,在 func1() 內(nèi)部定義 func2(),那么調(diào)用 func1() 時(shí)也就調(diào)用了 func2(),這是錯(cuò)誤的。
正確的寫法應(yīng)該是這樣的:
#include <stdio.h>
void func2(){
printf("C語言小白變怪獸");
}
void func1(){
printf("http://c.biancheng.net");
func2();
}
int main(){
func1();
return 0;
}
func1()、func2()、main() 三個(gè)函數(shù)是平行的,誰也不能位于誰的內(nèi)部,要想達(dá)到「調(diào)用 func1() 時(shí)也調(diào)用 func2()」的目的,必須將 func2() 定義在 func1() 外面,并在 func1() 內(nèi)部調(diào)用 func2()。
有些編程語言是允許函數(shù)嵌套定義的,例如 JavaScript,在 JavaScript 中經(jīng)常會(huì)使用函數(shù)的嵌套定義。
遞歸函數(shù)(兩個(gè)簡(jiǎn)易的遞歸調(diào)用)
1,階乘
函數(shù)的聲明
int MyFun(int num);
函數(shù)的實(shí)現(xiàn)
int MyFun(int num){
// 普通函數(shù)
// int sum1=1;
// for (int i=1; i<=num; i++) {
// sum1*=i;
// }
// return sum1;
// 遞歸調(diào)用
if (num==1||num==0) {
return 1;
}else {
return num*MyFun(num-1);
}
}
調(diào)用
printf("sum=%d\n",MyFun(6));
運(yùn)行效果

2,菲波那切數(shù)列數(shù)列
函數(shù)的聲明
int fbsnq(int num);
函數(shù)的實(shí)現(xiàn)
int fbsnq(int num){
// 遞歸
if(num==1||num==2){
return 1;
}
return fbsnq(num-1)+fbsnq(num-2);
//普通
// int n1=1,n2=1,temp=0;
// if (num==1||num==2) {
// return 1;
// }
// int i=2;
// for(;i<num;i++){
// temp=n1+n2;
// n1=n2;
// n2=temp;
// }
// return temp;
}
函數(shù)的調(diào)用
for (int i=1; i<=30; i++) {
if ((i-1)%5==0) {
printf("\n");
}
printf("%10d", fbsnq(i));
}
printf("\n\n");
運(yùn)行結(jié)果

到此這篇關(guān)于C語言自定義函數(shù)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C語言自定義函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
OpenCV利用背景建模檢測(cè)運(yùn)動(dòng)物體
這篇文章主要為大家詳細(xì)介紹了OpenCV利用背景建模檢測(cè)運(yùn)動(dòng)物體,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
舉例剖析C++中引用的本質(zhì)及引用作函數(shù)參數(shù)的使用
這篇文章主要介紹了C++中引用的本質(zhì)及引用作函數(shù)參數(shù)的使用,講解了函數(shù)返回值是引用的情況等一些難點(diǎn),需要的朋友可以參考下2016-03-03
C語言深入分析遞歸函數(shù)的實(shí)現(xiàn)
遞歸(recursive)函數(shù)是“自己調(diào)用自己”的函數(shù),無論是采用直接或間接調(diào)用方式。間接遞歸意味著函數(shù)調(diào)用另一個(gè)函數(shù)(然后可能又調(diào)用第三個(gè)函數(shù)等),最后又調(diào)用第一個(gè)函數(shù)。因?yàn)楹瘮?shù)不可以一直不停地調(diào)用自己,所以遞歸函數(shù)一定具備結(jié)束條件2022-04-04
C語言實(shí)現(xiàn)父進(jìn)程主動(dòng)終止子進(jìn)程的方法總結(jié)
一般的情況,子進(jìn)程自己運(yùn)行完后,執(zhí)行exit 或者return 后,父進(jìn)程wait. waitpid收回子進(jìn)程,但子進(jìn)程是一個(gè)循環(huán)等待狀態(tài)不主動(dòng)退出,父進(jìn)程可以采用文中介紹的幾種方法,需要的朋友可以參考下2023-10-10

