在數(shù)學(xué)函數(shù)是一種對(duì)應(yīng)關(guān)系,C語(yǔ)言里的函數(shù)和數(shù)學(xué)中的函數(shù)還是極其相似的
專注于為中小企業(yè)提供成都網(wǎng)站制作、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)潼關(guān)免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了超過(guò)千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。(1)維基百科對(duì)函數(shù)的定義
①維基百科:子程序 - 維基百科,自由的百科全書 (shenyinjise.icu)
②子程序。是大型程序中的某部分代碼,由一個(gè)或多個(gè)語(yǔ)句組成。負(fù)責(zé)完成某項(xiàng)特定的任務(wù),而且相較于其他代碼具有相對(duì)的獨(dú)立性。
C語(yǔ)言中的函數(shù),一般會(huì)有輸入?yún)?shù)并由返回值,提供對(duì)過(guò)程的封裝和細(xì)節(jié)的隱藏,這些代碼通常集成為一個(gè)軟件庫(kù)。
2、C語(yǔ)言中函數(shù)的分類(“庫(kù)函數(shù)”和“自定義函數(shù)”) (1)庫(kù)函數(shù)①C語(yǔ)言自帶的函數(shù),可以直接使用,方便程序員進(jìn)行軟件開發(fā)
可以在這個(gè)網(wǎng)站里面查找: https://cplusplus.com/
或者C/C++官網(wǎng): cppreference.com(中文版: cppreference.com)
或者使用工具M(jìn)SDN,可以離線查看,但是更新度不夠
②使用庫(kù)函數(shù),需要包含#include對(duì)應(yīng)的頭文件
③常用的庫(kù)文件如下:
不可能所有的庫(kù)函數(shù)都符合我們的需求,因此我們還需要自己寫符合自己需求的函數(shù),所以學(xué)會(huì)寫自定義函數(shù)是最為重要的!
①函數(shù)必須有這些構(gòu)成:函數(shù)的返回類型(注意這不是函數(shù)的類型)、函數(shù)名、函數(shù)參數(shù)列表、函數(shù)體
②偽代碼:函數(shù)的結(jié)構(gòu)
返回類型 函數(shù)名(參數(shù)列表)//注意返回指和參數(shù)列表可以是“空”,即void的情況
{函數(shù)體(具體代碼);
}//如果忘記寫返回類型,則默認(rèn)返回一個(gè)整數(shù),但不寫返回類型是一個(gè)壞習(xí)慣!
③一些例子
例子1:比大小的函數(shù)
int MAX(int x, int y)//自定義“相加”函數(shù)
{return (x>y)?(x):(y);//使用了三目操作符
}
int main()//主體函數(shù)
{int num_1 = 10;
int num_2 = 100;
int max = MAX(num_1, num_2);
printf("max = %d\n",max);
return 0;
}
例子2:查找閏年
int is_leap_year(int y)//自定義“判斷是否為閏年”函數(shù)
{return ((y % 4 == 0) && (y % 100 != 0)) || y % 400 == 0;
}
int main()//主體函數(shù)
{int y = 0;
for (y = 1000; y<= 2000; y++)
{//判斷y是否為閏年
//如果是閏年返回1
//如果不是閏年返回0
if (is_leap_year(y))
{printf("%d ", y);
}
}
return 0;
}
④一般來(lái)說(shuō)要先在主函數(shù)(主程序)里面寫如何去用、在哪里用這個(gè)函數(shù),再去寫自定義函數(shù)的具體實(shí)現(xiàn)會(huì)比較好一點(diǎn)。(這其實(shí)是TDD思想,TDD指“測(cè)試驅(qū)動(dòng)開發(fā)(Test-Driven Development)”)
3、函數(shù)的參數(shù) (1)實(shí)際參數(shù)(實(shí)參)真實(shí)傳給函數(shù)的參數(shù),實(shí)參可以是:常量、變量、表達(dá)式、函數(shù)等。
實(shí)參在進(jìn)行函數(shù)調(diào)用的時(shí)候,必須有確定的值,然后傳值給形參使用。
①簡(jiǎn)單來(lái)講就是函數(shù)定義后,函數(shù)名后面括號(hào)的內(nèi)容中的變量,只有在函數(shù)被調(diào)用的時(shí)候,實(shí)參傳值給形參時(shí),形參才會(huì)有值(即“才會(huì)實(shí)例化“,“才會(huì)分配內(nèi)存單元”,因此就是形式上的參數(shù))。
②更簡(jiǎn)單理解就是,“形參”是“實(shí)參”的臨時(shí)拷貝,對(duì)形參的改動(dòng)和修改是不會(huì)影響到實(shí)參的。
③如果需要通過(guò)形參來(lái)改動(dòng)實(shí)參,則不能只是傳遞值,而是應(yīng)該傳遞地址!
④另外形式參數(shù)在函數(shù)調(diào)用完后就自動(dòng)銷毀了,因此形式參數(shù)只有在函數(shù)內(nèi)部才是有效的
⑤函數(shù)中的形式參數(shù)是在棧中開辟空間的
int founction((a1, a2), (a3, a4), a5, a6);//函數(shù)有幾個(gè)參數(shù)呢?
實(shí)際上應(yīng)該是4個(gè)參數(shù),(a1, a2)和(a3, a4)是逗號(hào)表達(dá)式,他們都各有一個(gè)結(jié)果,分別為a2和a4,故實(shí)際上函數(shù)的參數(shù)為a2,a4,a5,a6四個(gè)參數(shù)
(4)函數(shù)參數(shù)個(gè)數(shù)設(shè)置得越少越好不然用戶使用的時(shí)候,還得搞清楚每個(gè)參數(shù)的意義,并且還要輸入很多參數(shù)才能使用
4、函數(shù)的調(diào)用(使用函數(shù)交換兩個(gè)數(shù)字) (1)傳值調(diào)用函數(shù)的形參和實(shí)參分別占有不同的內(nèi)存,對(duì)形參的修改不會(huì)影響實(shí)參。
如果寫成下面這個(gè)代碼就會(huì)交換失?。ū举|(zhì)就是形參和實(shí)參的問(wèn)題)
//一個(gè)典型的例子(寫一個(gè)錯(cuò)誤交換兩個(gè)數(shù)的函數(shù))
void function(int a, int b)//這里自定義函數(shù)只是臨時(shí)拷貝(傳過(guò)來(lái))num_1和num_2兩個(gè)數(shù)的值,所以下面只是x和y的值交換了,而num_1和num_2卻沒(méi)有進(jìn)行實(shí)際上的交換
{int t = 0;
t = a;
a = b;
b = t;
}
int main()
{int num_1 = 1;
int num_2 = 2;
printf("%d %d\n",num_1, num_2);
function(num_1, num_2);//使用交換函數(shù)
printf("%d %d\n", num_1, num_2);
return 0;
}//這個(gè)函數(shù)通過(guò)編譯器的調(diào)試功能會(huì)更加清晰看到
(2)傳址調(diào)用//一個(gè)典型的例子(寫一個(gè)正確交換兩個(gè)數(shù)的函數(shù))
void function(int *pa, int *pb)
{int t = 0;
t = *pa;
*pa = *pb;
*pb = t;
}
int main()
{int num_1 = 1;
int num_2 = 2;
printf("%d %d\n", num_1, num_2);
function(&num_1, &num_2);//使用交換函數(shù)
printf("%d %d\n", num_1, num_2);
return 0;
}
總之函數(shù)的調(diào)用無(wú)論是傳值還是傳址都有利弊,看情況選擇傳值方式。從功能上傳址調(diào)用比較強(qiáng)大,但是容易出現(xiàn)更多問(wèn)題。
(3)高內(nèi)聚低耦合函數(shù)設(shè)計(jì)應(yīng)該追求“高內(nèi)聚低耦合”:在函數(shù)體內(nèi)實(shí)現(xiàn)修改,盡量不要對(duì)外部產(chǎn)生影響,否則代碼不便修改
5、函數(shù)的“嵌套調(diào)用”和“鏈?zhǔn)皆L問(wèn)” (1)嵌套調(diào)用(在一個(gè)函數(shù)里調(diào)用了另一個(gè)函數(shù))#includevoid function_1()
{printf("aaaaa\n");
}
void function_2()
{int i = 0;
for(i=0; i<3; i++)
{function_1();//調(diào)用了另外一個(gè)函數(shù)
}
}
int main()
{function_2();
return 0;
}
注意:函數(shù)可以嵌套調(diào)用但是不能嵌套定義(一個(gè)A函數(shù)里面又定義了一個(gè)B函數(shù),但是可以在A定義里面調(diào)用一個(gè)已經(jīng)定義好的函數(shù)B(或者B定義里面調(diào)用一個(gè)已經(jīng)定義好的函數(shù)A))
//以下“嵌套定義”是不被允許的!
返回類型 f1(參數(shù)列表)
{//一些代碼
返回類型 f2(參數(shù)列表)
{//一些代碼
}
//一些代碼
}
(2)鏈?zhǔn)皆L問(wèn)(把一個(gè)函數(shù)的返回值作為另一個(gè)函數(shù)的參數(shù))//鏈?zhǔn)皆L問(wèn)例子1
#include#includeint main()
{printf("%d\n", strlen("abcd"));
return 0;
}
//鏈?zhǔn)皆L問(wèn)例子2
#includeint main()
{printf("%d",printf("%d",printf("%d",43)));//printf返回值是讀取到字符的個(gè)數(shù)
return 0;
}//結(jié)果為4321這四個(gè)字符,注意不是四千三百二十一,只是單純的輸出4、3、2、1這四個(gè)字符
6、函數(shù)的聲明和定義//實(shí)際上函數(shù)的聲明和變量的聲明很像
#includeint a;變量的聲明
int main()
{printf("%d\n",a);//變量的使用
return 0;
}
int a = 10;//變量的定義
//這種寫法也是可以正常打印出來(lái)10的
(1)函數(shù)的聲明①是為了告訴編譯器存在一個(gè)自定義的函數(shù),需要聲明函數(shù)的結(jié)構(gòu)
(函數(shù)名字、函數(shù)參數(shù)、返回類型)
②一般在使用函數(shù)之前聲明函數(shù)
③函數(shù)的聲明一般放在頭文件中
交代函數(shù)的具體實(shí)現(xiàn)方式
(3)教科書里常見(jiàn)函數(shù)聲明的使用:#includeint Add(int x, int y);//函數(shù)的聲明
int main()
{int a = 1, b = 2;
printf("%d", Add(a, b));//函數(shù)的使用
return 0;
}
int Add(int x, int y)//函數(shù)的定義
{return x + y;
}
//這種寫法雖然對(duì),但是實(shí)際情況一般不會(huì)這么寫,函數(shù)的聲明一般放在頭文件中,函數(shù)的實(shí)現(xiàn)則放到另外一個(gè)專門用來(lái)自定義函數(shù)的源文件中
(4)實(shí)際上的工程里常見(jiàn)的,函數(shù)聲明較多的寫法是://頭文件add.h中
#ifndef __ADD_H__
#define __ADD_H__
int Add(int x, int y);//函數(shù)的聲明
#endif
//函數(shù)定義源文件add.h
int Add(int x, int y)//函數(shù)的定義
{return x + y;
}
//程序主體文件main.h
#include#include "Add.h"
int main()//主函數(shù)
{int a = 1,b = 2;
printf("%d", Add(a, b));//函數(shù)的使用
return 0;
}
(5)一是適合分工、二是有保密措施(靜態(tài)庫(kù).lib的使用)①總不可能一堆程序員擠在一個(gè)電腦屏幕上寫代碼吧?多文件使得有程序員得以有效分工,每一個(gè)程序員寫各種工作的頭文件和源文件,最后再開始整合比較好
②使用VS產(chǎn)生靜態(tài)庫(kù)詳細(xì)步驟,見(jiàn)我另外一篇博客:VS靜態(tài)庫(kù)的產(chǎn)生和使用
遞歸適當(dāng)使用會(huì)大大減少代碼量
(1)什么是遞歸函數(shù)“直接”或者“間接”調(diào)用自己的一種編程技巧,它通常把一件“大事”化成“小事”來(lái)進(jìn)行求解,函數(shù)不斷遞推出去,然后再不斷地回歸,組合成“遞歸”一詞。
①最簡(jiǎn)單的遞歸
//最簡(jiǎn)單的遞歸,main函數(shù)自己調(diào)用自己
#includeint main()
{printf("abcd\n");
main();
}//不斷打印abcd此時(shí)main將不斷消耗棧區(qū)的空間,最后棧溢出,程序崩潰
②按照順序打印一個(gè)數(shù)的每一位數(shù)字字符
#includemy_printf(unsigned int x)
{if(x >9)
{my_printf(x / 10);
printf("%u ", x % 10);
}
else
{printf("%d ", x);
}
}
//大事化小
//my_printf(1234)
//my_printf(123)4
//my_printf(12)34
//my_printf(1)234
int main()
{unsigned int number = 0;
scanf("%u",&number);
my_printf(number);
return 0;
}
理解遞歸函數(shù)可以像上面一樣大事化小,或者是畫多個(gè)圖來(lái)理解
③自定義一個(gè)函數(shù),實(shí)現(xiàn)和strlen函數(shù)一樣的功能
#includemy_strlen(const char *str)
{if(*str == '\0')
{return 0;
}
else
{return (1 + my_strlen(str+1));
}
}
int main()
{char arr[10] = "abcdef";
printf("%d", my_strlen(arr));
return 0;
}
④第n個(gè)斐波那契數(shù)列(不考慮溢出的情況)
#includeint fun(int n)
{if (n<= 2)
return 1;
else
return fun(n - 1) + fun(n - 2);
}
int main()
{int n = 0;
while (scanf("%d", &n) == 1)
{printf("第%d個(gè)斐波那契數(shù)列為%d\n", n, fun(n));
}
return 0;
}
⑤階乘的實(shí)現(xiàn)(不考慮溢出的情況)
#includeint fun(int n)
{if (n<= 1)
{return 1;
}
else
{return n * fun(n - 1);
}
}
int main()
{int n = 0;
scanf("%d", &n);
printf("%d", fun(n));
return 0;
}
(2)遞歸的必要條件①存在限制條件(不能像上面main自己調(diào)用自己一樣,否則遲早棧溢出(stack overflow))讓遞歸停下
②每次遞歸都要接近這個(gè)條件,不能原封不動(dòng)
遞歸有可能大量消耗棧空間,計(jì)算量極大,有的時(shí)候反而效率低,例如:求斐波那契數(shù)列的時(shí)候求第50個(gè)數(shù)就會(huì)很吃力了,運(yùn)算時(shí)間很久
#includeint function(int n)//用遞歸的方法求斐波那契數(shù)列
{int a=1;
int b=1;
int c=1;
while(n >= 3)
{c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{return 0;
}
#includeint function(int n)
{int a = 1;
while(n >1)
{a *= n;
n--;
}
return a;
}
int main()//利用迭代求n的階乘
{int n = 0;
scanf("%d", &n);
printf("%d", function(n));
return 0;
}
(4)何時(shí)選遞歸看情況,那種方便少缺陷就選哪種,沒(méi)必要一定要寫出遞歸(當(dāng)然遞歸能大大減少代碼量)。況且迭代(循環(huán))的方法會(huì)更加清晰。
8、函數(shù)如何返回多個(gè)值(1)使用多個(gè)全局變量,在函數(shù)內(nèi)部改變,則相當(dāng)于函數(shù)返回了多個(gè)值
(2)返回一個(gè)數(shù)組指針,就可以通過(guò)數(shù)組返回多個(gè)值
(3)形參使用多個(gè)指針變量,在函數(shù)體內(nèi)部解引用,改變指針指向的值
唯獨(dú)不能單用return,只能返回一個(gè)值,即一個(gè)函數(shù)只能返回單個(gè)結(jié)果,不能是多個(gè)
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前名稱:C語(yǔ)言入門知識(shí)——(1)函數(shù)基礎(chǔ)-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://jinyejixie.com/article6/dijhog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、外貿(mào)網(wǎng)站建設(shè)、商城網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站收錄、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
移動(dòng)網(wǎng)站建設(shè)知識(shí)