函數概述
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;
}