第三十四章 老君煉丹記(下)
「函數(shù)?」
我和小弦子兩臉懵逼,對(duì)這個(gè)從來(lái)沒(méi)有聽(tīng)說(shuō)過(guò)的詞匯充滿(mǎn)了疑問(wèn)。
「也別想太復(fù)雜,函數(shù)其實(shí)就是實(shí)現(xiàn)了某個(gè)功能的代碼段。當(dāng)我們要使用這個(gè)功能的時(shí)候,只需要調(diào)用函數(shù)就行了,而不是再寫(xiě)一段相似的代碼。就好比說(shuō)故事中的煉丹爐,太上老君在煉丹之前只需要把煉丹相關(guān)的程序設(shè)定好就行了,而不是每次都自己動(dòng)手,去進(jìn)行繁瑣復(fù)雜的事情。
再舉個(gè)簡(jiǎn)單的例子,奶奶使用電飯煲煮飯你看到過(guò)吧?現(xiàn)在煮飯只需要三個(gè)步驟:淘米摻水、上電、按煮飯按鈕。在老爹小時(shí)候,煮飯可不是一件容易的事情,你得自己先燒一鍋水,等水開(kāi)了之后淘米,倒進(jìn)鍋里,然后一邊燒火保持鍋內(nèi)的水沸騰,一邊還要頻繁攪拌,不讓米粒沉降在鍋底。
等到米粒五六分熟的時(shí)候,還要用筲箕將它們?yōu)r干,最后再用甑子把半生夾熟的米粒蒸熟。
而現(xiàn)在煮飯這個(gè)功能已經(jīng)電飯煲實(shí)現(xiàn)了,所以我們現(xiàn)在煮飯只需要調(diào)用電飯煲的煮飯功能就行了,快捷又方便。
函數(shù)的本質(zhì)作用就和煉丹爐、電飯煲一樣,是實(shí)現(xiàn)了某種功能代碼段,至于要實(shí)現(xiàn)什么功能,這就要靠我們程序員來(lái)定義了?!?p> 有兩個(gè)例子做分析論證,我慢慢理解了為什么要使用函數(shù),以及函數(shù)是什么。既然我都明白了,小弦子肯定也早就悟得其真諦。
「既然已經(jīng)知道why和what了,那么接下來(lái)就應(yīng)該學(xué)習(xí)how,如何使用?其實(shí)不管是學(xué)習(xí)編程也好,還是學(xué)習(xí)其他的東西,你只要按照這個(gè)套路來(lái),基本上不會(huì)出岔子。
在學(xué)習(xí)如何使用的過(guò)程中,我們依然用煉丹爐和電飯煲這兩個(gè)例子來(lái)說(shuō)明。
要使用函數(shù),那咱們得先定義函數(shù)。你要煉丹,沒(méi)有煉丹爐怎么煉?煮飯沒(méi)有電飯煲怎么煮。所以我們?nèi)绻褂媚硞€(gè)函數(shù),必須得先定義。
當(dāng)然了,不是所有函數(shù)都需要自己的定義,有可能別人已經(jīng)給你定義好了,就像是printf()函數(shù),這個(gè)是C語(yǔ)言函數(shù)庫(kù),也就是開(kāi)發(fā)C語(yǔ)言的那些科學(xué)家已經(jīng)定義好了的,咱們直接拿來(lái)使用就行了。
你們想啊,咱們沒(méi)有電飯煲的時(shí)候總不能自己造一個(gè)吧,可以去商店里面買(mǎi)一個(gè),因?yàn)閯e人已經(jīng)造好了。
好了,閑話(huà)休提,言歸正傳。
要定義個(gè)函數(shù),實(shí)現(xiàn)一個(gè)功能,你總得給它起個(gè)名字吧?雖然這個(gè)名字只要符合之前講過(guò)的其名法則即可,但是我們還是盡量讓它貼近功能。你看煉丹爐、電飯煲這兩個(gè)名字,人一聽(tīng)就知道是用來(lái)干什么的。
起名可是頭等大事,不能含糊,名字起好了問(wèn)題就解決一半了!當(dāng)然這是不可能的,哪有那么便宜的事情。
接下來(lái)就是要完成這個(gè)功能,需要一些什么條件因素了。如果要煉丹,你總得準(zhǔn)備草藥啊什么的吧?要煮飯總得要米、水這些東西吧。
當(dāng)然了,也不絕對(duì)。你們看,按照理論上來(lái)說(shuō)煉丹爐和電飯煲都還有一些不需要任何東西的功能,比如說(shuō)給孫悟空煉火眼金睛的時(shí)候,不就什么都沒(méi)有放么?
然后就是這個(gè)功能要得到什么東西,你看,煉丹煉丹,最后得到的是仙丹,煮飯煮飯,最后得到的時(shí)候米飯。
所以我們的函數(shù)也可以得到一些東西,當(dāng)然了也不是絕對(duì)的。如果煉丹爐就那么燒著玩兒,也不會(huì)得到仙丹是吧?
最后一步,就是具體功能的實(shí)現(xiàn)過(guò)程了,這個(gè)需要我們來(lái)做。
以上在C語(yǔ)言中都有它們專(zhuān)業(yè)的叫法,起的名字叫做函數(shù)名,需要的元素叫做參數(shù),得到的結(jié)果叫做返回值。
上面的內(nèi)容總結(jié)起來(lái),一個(gè)函數(shù)的聲明格式如下:
返回值函數(shù)名稱(chēng)(參數(shù)列表)
{
實(shí)現(xiàn)功能的代碼;
return 返回值;
}
其中有幾個(gè)地方需要注意返回值可以是某種具體數(shù)據(jù)類(lèi)型,如byte、short、int、long、float、double、char這樣的基本數(shù)據(jù)類(lèi)型,也可以是我們以后要學(xué)的結(jié)構(gòu)體、枚舉等類(lèi)型。如果一個(gè)函數(shù)沒(méi)有返回值,就需要聲明為void,這個(gè)單詞是『空』的意思。
同樣的,參數(shù)列表也可以是這些數(shù)據(jù)類(lèi)型,如果有多個(gè)參數(shù),則需要用英文狀態(tài)下的逗號(hào)隔開(kāi)。若是沒(méi)有輸入?yún)?shù),則也聲明為void。
最后說(shuō)一下那個(gè)return,這個(gè)關(guān)鍵字會(huì)結(jié)束一個(gè)函數(shù),如果在聲明函數(shù)的時(shí)候返回值不為void的話(huà),這個(gè)時(shí)候return后面就必須跟聲明的返回值類(lèi)型?!?p> 聽(tīng)著老爹講了一通,我完全不明所以。就連一向聰明絕頂?shù)男∠易右彩且活^霧水。
「我知道,這些概念聽(tīng)來(lái)有些難以理解,那么我們用實(shí)際的代碼來(lái)說(shuō)明一個(gè)函數(shù)的定義?!?p> 老爹微微一笑,似乎我和小弦子的反應(yīng)完全在他的意料范圍之內(nèi)。
「嗯,首先我們來(lái)一個(gè)對(duì)兩個(gè)int型數(shù)值做加法的函數(shù),假設(shè)函數(shù)名字叫做add,也就是加法的意思,表名我們這個(gè)函數(shù)是要做加法。
然后呢,我們這個(gè)加法函數(shù)需要兩個(gè)int型參數(shù),分別是a和b,代表兩個(gè)加數(shù)。
最后咱們還要計(jì)算得到的結(jié)果返回出來(lái)。
那么,要實(shí)現(xiàn)這個(gè)函數(shù),其代碼如下:
int add(int a,int b)
{
int sum = a + b;
return sum;
}
這樣我們就定義好了一個(gè)做加法的函數(shù)了。既然函數(shù)一定定義好了,接下來(lái)就是如何使用的問(wèn)題了。
比如說(shuō)我們要計(jì)算10+20的結(jié)果,那么就可以這樣:
int sum = add(10,20);
這樣add函數(shù)的返回值就會(huì)賦值給變量sum,這個(gè)時(shí)候sum里面的值就是30。」
「任叔叔,玥玥給我的教學(xué)文檔上說(shuō)過(guò),C語(yǔ)言里面給變量起名字的時(shí)候不能出現(xiàn)一樣的,現(xiàn)在add函數(shù)里面和外面都有一個(gè)名字叫sum的變量,這不是和你之前的說(shuō)法互相矛盾么?」
小弦子不解地問(wèn)道。
竟他這么一提問(wèn),我也意識(shí)到了這個(gè)問(wèn)題。
「不錯(cuò)不錯(cuò),看來(lái)你們果然對(duì)之前的知識(shí)掌握得不錯(cuò)。我之所以會(huì)這樣寫(xiě),就是為了引出這個(gè)問(wèn)題,如果你們沒(méi)有發(fā)現(xiàn)我也會(huì)主動(dòng)拋出這個(gè)問(wèn)題。
不管怎么樣,你們先在嘗試寫(xiě)我剛才定義的函數(shù),然后運(yùn)行一下看看會(huì)不會(huì)報(bào)錯(cuò)再說(shuō)?!?p> 老爹笑瞇瞇地說(shuō)道。