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