函數概述
1.為什麼需要函數
當大型程序中,某個功能,會被反復利用,我們把這些功能【封裝】成功能模塊,稱為函數。以後想使用這個功能,只需調用這個函數就可以了。使用函數可以降低開發成本,利於維護
2.函數的分類
庫函數:由官方或者第三方庫編寫的函數,保存在動態庫,靜態庫,甚至是開源代碼。程序員可以直接調用。使用庫函數時往往伴隨著導入庫或者導入頭文件。如arc4random()在stdlib庫中,需要頭文件支持,通常不能修改。
自定義函數:我們自己根據項目需要寫的函數。
3.函數由最簡單的函數(無參數無返回值函數)、帶參數和返回值的函數兩類構成。
函數講解
1.最簡單的函數:左邊的void(空),表示沒有返回值,中間的func是標識符,表示【函數名】,右邊括號裡的void沒有【參數】。聲明和實現是創造一個函數,調用(使用)是使用函數。
//函數的聲明 void func(void); int main(int argc, const char * argv[]) { //函數的調用 func(); return 0; } //函數的實現 void func(void) { printf("hello world\n"); }
2.函數的傳參
/* 如果函數在調用之前實現,就不需要聲明 * @param a叫做這個函數的形參,形參是變量。傳參的過程a = 5,a=2就是把值賦給變量的過程。 */ void func(int a) { for (int i = 0; i < a; i++) { printf("hello world\n"); } } int main(int argc, const char * argv[]) { func(5);//值,函數的實參,實參是值 func(2); return 0; }
3.帶返回值和帶參數的函數:
//它的返回值是變量(int),參數列表是兩個變量(int,int) int addHT(int a,int b) { return a + b; } int main(int argc, const char * argv[]) { int a = 5; int b = 3; int c; //讓c等於這個函數的返回值 c = addHT(a, b); printf("%d\n",c); printf("%d",addHT(a, b)); return 0; }
4.作用域:變量的作用域(有效范圍)是大括號之內,出了作用域就沒有用了
void func(void) { int a; { int b; //只能在此大括號內對變量b進行操作 } //只能在此大括號內對變量a進行操作 }
5.全局變量:聲明在所有函數之外的變量,稱為全局變量,作用域是從聲明開始一直到文件尾。數據段的數據,默認為0
//全局變量,從聲明開始一直到文件尾 int a; void ret(void) { a = 5; } int main(int argc, const char * argv[]) { ret(); printf("a = %d\n",a); a = 8; printf("a = %d\n",a); return 0; }
6.靜態變量:
①函數體內static變量的作用范圍為該函數體,該變量只被分配一次,其值在下次調用的時候扔維持上次調用的值。
②模塊內的static全局變量可以被模塊內的所有函數訪問,但不能被模塊外的其他函數訪問。
③模塊內的static函數只能被該模塊內部的其他函數調用,這個函數的使用范圍被限制在該模塊內部。
static int situationNum = 5; void test(void) { static int partNum = 5; partNum++; situationNum++; printf("testPartNum = %d\n",partNum); printf("testSituationNum = %d\n",situationNum); } int main(int argc, const char * argv[]) { test(); test(); situationNum++; printf("mainSituationNum = %d\n",situationNum); return 0; }
小練習
1.編寫函數,求4個數的平均值。
2.編寫函數,打印三個數的最大值 。(三目運算符: a>b?a:b的含義是如果a>b是a否則是b)。
參考答案(一萬個讀者有一萬個哈姆雷特,一萬個程序員有一萬種編碼風格,答案僅供參考)
1.編寫函數,求4個數的平均值。
void mean(int a,int b,int c,int d) { printf("%d",(a+b+c+d)/4); } int main(int argc, const char * argv[]) { mean(10,20,30,40); return 0; }
2.編寫函數,打印三個數的最大值 。(三目運算符: a>b?a:b的含義是如果a>b是a否則是b)。
void maxOfThree(int a,int b,int c) { printf("%d",(a>b?a:b)>c?(a>b?a:b):c); } int main(int argc, const char * argv[]) { int a = 5; double b = 15.4; float c = 0.003; maxOfThree(a, b, c); return 0; }