一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C語言自定義函數的實現

C語言自定義函數的實現

2021-10-21 11:58C語言中文網 C/C++

這篇文章主要介紹了C語言自定義函數的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

函數是一段可以重復使用的代碼,用來獨立地完成某個功能,它可以接收用戶傳遞的數據,也可以不接收。接收用戶數據的函數在定義時要指明參數,不接收用戶數據的不需要指明,根據這一點可以將函數分為有參函數和無參函數。

將代碼段封裝成函數的過程叫做函數定義。

C語言無參函數的定義

如果函數不接收用戶傳遞的數據,那么定義時可以不帶參數。如下所示:

?
1
2
3
dataType functionName(){
  //body
}
  • dataType 是返回值類型,它可以是C語言中的任意數據類型,例如 int、float、char 等。
  • functionName 是函數名,它是標識符的一種,命名規則和標識符相同。函數名后面的括號( )不能少。
  • body 是函數體,它是函數需要執行的代碼,是函數的主體部分。即使只有一個語句,函數體也要由{ }包圍。
  • 如果有返回值,在函數體中使用 return 語句返回。return 出來的數據的類型要和 dataType 一樣。

例如,定義一個函數,計算從 1 加到 100 的結果:

?
1
2
3
4
5
6
7
int sum(){
  int i, sum=0;
  for(i=1; i<=100; i++){
    sum+=i;
  }
  return sum;
}

累加結果保存在變量sum中,最后通過return語句返回。sum 是 int 型,返回值也是 int 類型,它們一一對應。

return是C語言中的一個關鍵字,只能用在函數中,用來返回處理結果。

將上面的代碼補充完整:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
#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 表示,例如:

?
1
2
3
4
void hello(){
  printf ("Hello,world \n");
  //沒有返回值就不需要 return 語句
}

void是C語言中的一個關鍵字,表示“空類型”或“無類型”,絕大部分情況下也就意味著沒有 return 語句。

C語言有參函數的定義

如果函數需要接收用戶傳遞的數據,那么定義時就要帶上參數。如下所示:

?
1
2
3
dataType functionName( dataType1 param1, dataType2 param2 ... ){
  //body
}

dataType1 param1, dataType2 param2 ...是參數列表。函數可以只有一個參數,也可以有多個,多個參數之間由,分隔。參數本質上也是變量,定義時要指明類型和名稱。與無參函數的定義相比,有參函數的定義僅僅是多了一個參數列表。

數據通過參數傳遞到函數內部進行處理,處理完成以后再通過返回值告知函數外部。

更改上面的例子,計算從 m 加到 n 的結果:

?
1
2
3
4
5
6
7
int sum(int m, int n){
  int i, sum=0;
  for(i=m; i<=n; i++){
    sum+=i;
  }
  return sum;
}

參數列表中給出的參數可以在函數體中使用,使用方式和普通變量一樣。

調用 sum() 函數時,需要給它傳遞兩份數據,一份傳遞給 m,一份傳遞給 n。你可以直接傳遞整數,例如:

?
1
int result = sum(1, 100); //1傳遞給m,100傳遞給n

也可以傳遞變量:

?
1
2
3
int begin = 4;
int end = 86;
int result = sum(begin, end); //begin傳遞給m,end傳遞給n

也可以整數和變量一起傳遞:

?
1
2
int num = 33;
int result = sum(num, 80); //num傳遞給m,80傳遞給n

函數定義時給出的參數稱為形式參數,簡稱形參;函數調用時給出的參數(也就是傳遞的數據)稱為實際參數,簡稱實參。函數調用時,將實參的值傳遞給形參,相當于一次賦值操作。

原則上講,實參的類型和數目要與形參保持一致。如果能夠進行自動類型轉換,或者進行了強制類型轉換,那么實參類型也可以不同于形參類型,例如將 int 類型的實參傳遞給 float 類型的形參就會發生自動類型轉換。

將上面的代碼補充完整:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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,這和給變量賦值的過程是一樣的,它等價于:

?
1
2
m = begin;
n = end;

函數不能嵌套定義

強調一點,C語言不允許函數嵌套定義;也就是說,不能在一個函數中定義另外一個函數,必須在所有函數之外定義另外一個函數。main() 也是一個函數定義,也不能在 main() 函數內部定義新函數。

下面的例子是錯誤的:

?
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
void func1(){
  printf("http://c.biancheng.net");
  void func2(){
    printf("C語言小白變怪獸");
  }
}
int main(){
  func1();
  return 0;
}

有些初學者認為,在 func1() 內部定義 func2(),那么調用 func1() 時也就調用了 func2(),這是錯誤的。

正確的寫法應該是這樣的:

?
1
2
3
4
5
6
7
8
9
10
11
12
#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,階乘

函數的聲明

?
1
int MyFun(int num);

函數的實現

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);
  
  }
}

調用

?
1
printf("sum=%d\n",MyFun(6));

運行效果

 C語言自定義函數的實現

2,菲波那切數列數列

函數的聲明

?
1
int fbsnq(int num);

函數的實現

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
}

函數的調用

?
1
2
3
4
5
6
7
8
for (int i=1; i<=30; i++) {
  if ((i-1)%5==0) {
    printf("\n");
  }
    printf("%10d", fbsnq(i));
}
 
printf("\n\n");

運行結果

C語言自定義函數的實現

到此這篇關于C語言自定義函數的實現的文章就介紹到這了,更多相關C語言自定義函數內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:http://c.biancheng.net/view/1851.html

延伸 · 閱讀

精彩推薦
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
主站蜘蛛池模板: 女同学用白丝脚玩我的故事 | 大乳女子一级毛片 | 成人香蕉xxxxxxx | 欧美国产影院 | 香蕉国产人午夜视频在线观看 | 国产高清亚洲 | 久久毛片免费看一区二区三区 | 成年性香蕉漫画在线观看 | 欧美一级专区免费大片 | 精品国产美女AV久久久久 | 久久精品国产色蜜蜜麻豆国语版 | 男人使劲躁女人小视频 | 日本成熟bbxxxxxxxx | 51精品 | 97爱sese| 欧美xingai| 色99视频| 亚洲精美视频 | 无敌秦墨漫画免费阅读 | 色老板在线观看 | 国产麻豆精品入口在线观看 | 青青视频国产依人在线 | 免费真实播放国产乱子伦 | 深夜福利一区 | 国产精品成人免费福利 | 国产区一二三四区2021 | 免费一级欧美片在线观免看 | 欧美整片完整片视频在线 | 国产区香蕉精品系列在线观看不卡 | xxxxx大片在线观看 | 午夜看片a福利在线观看 | 成年人在线观看免费视频 | 白丝爆动漫羞羞动漫软件 | 日本又大又硬又粗的视频 | 99久久香蕉国产综合影院 | 69一级毛片 | 4444亚洲国产成人精品 | 香蕉久久一区二区三区啪啪 | 色老板视频在线观看 | 国语自产拍在线播放不卡 | 猫咪maomiav永久网址 |