亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

【C語言】02-函數

2019-11-14 18:15:24
字體:
來源:轉載
供稿:網友

一、函數的分類

前面已經說過,C語言中的函數就是面向對象中的"方法",C語言的函數可以大概分為3類:

1.主函數,也就是main函數。每個程序中只能有一個、也必須有一個主函數。無論主函數寫在什么位置,C程序總是從主函數開始執行

2.開發人員自定義的函數,可有可無,數目不限

3.C語言提供的庫函數,例如stdio.h中的輸出函數PRintf()和輸入函數scanf()

 


二、函數的聲明和定義

雖說C中的函數類似于java中的方法,但在使用上還是有區別的。

1.在Java中,每個方法的定義順序沒有限制,在前面定義的方法內部可以調用后面定義的方法

復制代碼
1 public void test() {2      int c = sum(1, 4);3  }4  5  public int sum(int a, int b) {6      return a + b;7  }
復制代碼

第1行定義的test方法可以調用在第5行定義的sum方法

 

2.在標準C語言中,函數的定義順序是有講究的,默認情況下,只有后面定義的函數才可以調用前面定義過的函數

復制代碼
1 int sum(int a, int b) {2      return a + b;3  }4  5  int main()6  {7      int c = sum(1, 4);8      return 0;9  }
復制代碼

第5行定義的main函數調用了第1行的sum函數,這是合法的。如果調換下sum函數和main函數的順序,在標準的C編譯器環境下是不合法的(不過在Xcode中只是警告,Xcode中用的是GCC編譯器)

 

3.如果想把其他函數的定義寫在main函數后面,而且main函數能正常調用這些函數,那就必須在main函數前面作一下函數的聲明

復制代碼
 1 // 只是做個函數聲明,并不用實現 2  int sum(int a, int b); 3   4  int main() 5  { 6      int c = sum(1, 4); 7      return 0; 8  } 9  10  // 函數的定義(實現)11  int sum(int a, int b) {12      return a + b;13  }
復制代碼

我們在第2行做了sum函數的聲明,然后在第6行(main函數中)就可以正常調用sum函數了。

函數的聲明格式:

返回值類型  函數名 (參數1, 參數2, ...)

可以省略參數名稱,比如上面的sum函數聲明可以寫成這樣:

int sum(int, int);

只要你在main函數前面聲明過一個函數,main函數就知道這個函數的存在,就可以調用這個函數。究竟這個函數是做什么用,還要看函數的定義。如果只有函數的聲明,而沒有函數的定義,那么程序將會在鏈接時出錯。

 

4.在大型的C程序中,為了分模塊進行開發,一般會將函數的聲明和定義(即實現)分別放在2個文件中,函數聲明放在.h頭文件中,函數定義放在.c源文件中

下面我們將sum函數的聲明和定義分別放在sum.h和sum.c中

sum.h文件

 

sum.c文件

 

然后在main.c中包含sum.h即可使用sum函數

其實sum.h和sum.c的文件名不一樣要相同,可以隨便寫,只要文件名是合法的

運行步驟分析:

1> 在編譯之前,預編譯器會將sum.h文件中的內容拷貝到main.c中

2> 接著編譯main.c和sum.c兩個源文件,生成目標文件main.obj和sum.obj,這2個文件是不能被單獨執行的,原因很簡單:

* sum.obj中不存在main函數,肯定不可以被執行

* main.obj中雖然有main函數,但是它在main函數中調用了一個sum函數,而sum函數的定義卻存在于sum.obj中,因此main.obj依賴于sum.obj

3> 把main.obj、sum.obj鏈接在一起,生成可執行文件

4> 運行程序

 

說到這里,有人可能有疑惑:可不可以在main.c中包含sum.c文件,不要sum.h文件了?

大家都知道#include的功能是拷貝內容,因此上面的代碼等效于:

這么一看,語法上是絕對沒有問題的,但是絕對運行不起來,在鏈接時會出錯。原因:編譯器會編譯所有的.c源文件,這里包括main.c、sum.c,編譯成功后生成sum.obj、main.obj文件,當鏈接這兩個文件時鏈接器會發現sum.obj和main.obj里面都有sum函數的定義,于是報"標識符重復"的錯誤。

 

有人可能覺得分出sum.h和sum.c文件的這種做法好傻B,好端端多出2個文件,你把所有的東西都寫到main.c不就可以了么?

  • 沒錯,整個C程序的代碼是可以都寫在main.c中。但是,如果項目做得很大,你可以想象得到,main.c這個文件會有多么龐大,會嚴重降低開發和調試效率。
  • 要想出色地完成一個大項目,需要一個團隊的合作,不是一個人就可以搞的定的。如果把所有的代碼都寫在main.c中,那就導致代碼沖突,因為整個團隊的開發人員都在修改main.c文件,張三修改的代碼很有可能會抹掉李四之前添加的代碼。
  • 正常的模式應該是這樣:假設張三負責編寫main函數,李四負責編寫一系列的自定義函數,張三需要用到李四編寫的某個函數,怎么辦呢?李四可以將所有的函數聲明在一個.h文件中,比如lisi.h,然后張三在他自己的代碼中包含lisi.h文件,接著就可以調用lisi.h中聲明的函數了,而李四呢,可以獨立地在另外一個文件中(比如lisi.c)編寫函數的定義,實現那些在lisi.h中聲明的函數。這樣子,張三和李四就可以相互協作、不會沖突。

 


三、函數的形參和實參

在定義函數時,函數名后面的()中定義的變量稱為形式參數(形參);在調用函數時傳入的值稱為實際參數(實參)。

復制代碼
// b是test函數的形參(形式參數)void test(int b) 
{ b = 9; // 改變了形參b的值}int main(){ int a = 10; printf("函數調用前的a:%d/n", a); test(a); // a是test函數的實參(實際參數) printf("函數調用后的a:%d", a); return 0;}
復制代碼

如果是基本數據類型作為函數的形參,那是簡單的值傳遞,將實參a的值賦值給了形參b,相當于

int a = 10;int b = a;b = 9;

a和b是分別有著不同內存地址的2個變量,因此改變了形參b的值,并不會影響實參a的值。

上述代碼的輸出結果為:

關于函數的補充

C程序由函數構成。函數是C程序的基本單位。程序的全部工作都是由各個函數分別完成。被調用的函數可以是系統提供的庫函數,也可以是用戶根據需要自己編制設計的函數。C的函數相當于其他語言中的子程序。

一個較大的程序一般應分為若干個程序模塊,每一個模塊用來實現特定的功能。

一個C程序可由一個主函數和若干個其他函數構成。由主函數調用其他函數,其他函數也可以互相調用。同一個函數可以被一個或多個函數調用多次。

在程序開發中,常將一些常用的功能模塊編寫成函數,放在公共函數庫中供大家選用。程序設計人員要善于利用函數,以減少重復編寫程序段的工作量。

一個C程序的說明

一個C程序由一個或多個程序模塊組成,每一個模塊作為一個源程序文件。對于較大程序,一般不希望把所有內容全放在一個文件中,而是將它們分別放在若干個源文件中,再由若干個源程序文件組成一個C程序。這樣寫便于分別編寫、分別編譯,提高調試效率。一個源程序文件可以由多個C程序公用。

一個源程序文件由一個或多個函數以及其它內容(命令行、數據定義等)組成。一個源程序文件是一個編譯單位,在程序編譯時是以源程序文件為單位進行編譯,而不是以函數為單位進行編譯。

C程序的執行是從main函數開始的,如果在main函數中調用其他函數,在調用后流程返回到main函數,在main函數中結束整個程序的運行

所有函數都是平行的,即在定義函數時是分別進行的,是互相獨立的。一個函數并不從屬與另一個函數,即函數不能嵌套定義。函數可以互相調用,但不能調用main函數,main函數由系統調用

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产脚交av在线一区二区| 精品久久久久久久中文字幕| 国内精品久久久久久久| 中文字幕av一区二区三区谷原希美| 尤物九九久久国产精品的分类| 日韩在线播放视频| 欧美大片大片在线播放| 91国产精品视频在线| 亚洲电影免费观看高清完整版在线观看| 欧美激情一区二区三区久久久| 中文字幕亚洲欧美在线| 91精品国产电影| 国产精品三级美女白浆呻吟| 久久人人爽国产| 欧美高清电影在线看| 国产精品自在线| 久久久久久国产精品美女| 国产精品久久久久久久美男| 国产精品久在线观看| 免费不卡在线观看av| 亚洲精品网站在线播放gif| 成人精品久久一区二区三区| 欧美激情欧美激情| 丰满岳妇乱一区二区三区| 91大神福利视频在线| 久久成人在线视频| 午夜精品三级视频福利| 国产一区二区视频在线观看| 久久久久久国产三级电影| 国产成人一区二区| 亚洲人成网站在线播| 国产精品成久久久久三级| 91在线高清免费观看| 日韩最新中文字幕电影免费看| 国内精品小视频| 日韩电视剧在线观看免费网站| 日本三级韩国三级久久| 日韩欧美在线观看视频| 国产精品极品美女在线观看免费| 国产精品99久久久久久www| 欧美日韩在线影院| 国产日韩欧美黄色| 成人中心免费视频| 欧美二区乱c黑人| 在线免费观看羞羞视频一区二区| 色伦专区97中文字幕| 久久久久久亚洲| 久久精品国产综合| 久久成人av网站| 久久久久久久久久久网站| 欧美视频在线免费| 91成人在线观看国产| 欧美诱惑福利视频| 亚洲人成电影在线播放| 久久99视频免费| 夜夜嗨av色综合久久久综合网| 午夜精品蜜臀一区二区三区免费| 91视频免费网站| 亚洲国产99精品国自产| 亚洲黄色av女优在线观看| 久久免费视频在线观看| 日韩精品极品毛片系列视频| 精品香蕉在线观看视频一| 欧美成人国产va精品日本一级| 成人性生交大片免费观看嘿嘿视频| 日韩高清电影好看的电视剧电影| 亚洲精品成人久久久| 亚洲美女免费精品视频在线观看| 影音先锋日韩有码| 91中文在线视频| 黑人巨大精品欧美一区二区免费| 亚洲精品小视频在线观看| 日韩高清av一区二区三区| 日韩免费观看av| 久久激情五月丁香伊人| 中文字幕精品久久| 国内精品久久久久久久久| 国产精品视频免费在线观看| 久久伊人免费视频| 高清亚洲成在人网站天堂| 久久综合久久88| 亚洲精品国产拍免费91在线| 国产精品一久久香蕉国产线看观看| 亚洲人成在线观看网站高清| 精品国产网站地址| 国产九九精品视频| 欧美亚洲成人网| 久久综合伊人77777| 成人免费xxxxx在线观看| 日韩欧美高清在线视频| 中文字幕久久亚洲| 国产午夜精品久久久| 成人久久久久久久| 亚洲天堂av综合网| 亚洲国产精品va在线观看黑人| 国产精品视频区| 91天堂在线视频| 欧美影院成年免费版| 亚洲精品影视在线观看| 欧美亚洲国产精品| 国产999精品久久久| 亚洲视频电影图片偷拍一区| 久久久av一区| 欧美日韩国产成人在线观看| 欧美激情区在线播放| 欧美性视频网站| 久热精品视频在线观看一区| 欧美电影《睫毛膏》| 91在线视频成人| 亚洲欧洲在线观看| 国产成人精品亚洲精品| 国产亚洲激情视频在线| 粉嫩av一区二区三区免费野| 亚洲欧美日韩在线高清直播| 亚洲人线精品午夜| 成人国产精品一区二区| 日本久久久久久久| 国产精品白嫩美女在线观看| 伊人青青综合网站| 国产z一区二区三区| 97香蕉超级碰碰久久免费软件| 国产精品亚发布| 亚洲人成电影网站色xx| 亚洲色在线视频| 日韩美女视频免费看| 亚洲韩国欧洲国产日产av| 成人激情春色网| 精品久久久久久久久中文字幕| 欧美精品久久久久久久| 91国产精品电影| 国产丝袜精品视频| 97超碰蝌蚪网人人做人人爽| 亚洲自拍偷拍一区| 国产成人黄色av| 欧美性极品少妇精品网站| 亚洲人成电影在线| 亚洲国产精品网站| 欧美日本高清一区| 日本不卡高字幕在线2019| 精品久久久久久久久久ntr影视| 国产成人拍精品视频午夜网站| 欧美日韩国产在线| 136fldh精品导航福利| 国产在线98福利播放视频| 一本色道久久88精品综合| 亚洲国产成人久久| 欧美日韩亚洲视频一区| 大量国产精品视频| 欧美体内谢she精2性欧美| 久久精品成人动漫| 久久在线免费观看视频| 亚洲国产精品久久久久秋霞蜜臀| 在线观看国产精品淫| 在线观看亚洲视频| 精品小视频在线| 91精品国产高清自在线| 91po在线观看91精品国产性色| 最近中文字幕日韩精品| 亚洲欧美一区二区三区久久| 欧美成人精品在线| 久久视频中文字幕| 亚洲综合精品伊人久久| 久久久精品网站| 欧美激情亚洲一区|