你知道C語言中函數調用和嵌套嗎?函數必學模塊,你不得不知!


一、函數調用

什么是函數調用呢?通常在C語言中,一個完整的項目程序是不可能在一個函數中實現所有的功能。而是由若干功能不同的函數來實現,並且函數之間會存在互相調用的情況。

當然了,也不是說就一定要把函數的功能模塊都分開來寫,但是如果你寫成了下面這個樣子:


 

我估計以后你的項目經理肯定會對你好(ba)言(dao)相(xiang)勸(xiang)的。


 

 

二、函數的調用方式

函數是C語言的基本組成元素,如果你要想實現函數的功能,那么你就必須學會正確調用函數。調用的語法格式如下:


 

從上面的語法格式可以看出,當我們調用一個函數時,需要明確函數名和實參列表。實參列表中的參數可以是常量、變量、表達式或者空,並且各參數之間要使用英文逗號分隔開來。

 

根據函數在程序中出現的位置,有下列三種函數調用方式:

1、將函數作為表達式調用

將函數作為表達式調用時,函數的返回值參與表達式的運算,此時要求函數必須有返回值。示例代碼如下所示:


 

2、將函數作為語句調用

函數以語句的形式出現時,可以將函數作為一條語句進行調用。示例代碼如下所示:


 

3、將函數作為實參調用

將函數作為另一個函數的實參時,要求該函數有返回值。示例代碼如下所示:


 

在上面的語句中,將函數max()的返回值作為printf()函數的實參來使用。

 

三、嵌套調用

在C語言中,函數的定義是獨立的,也就是說,一個函數不能定義在另一個函數內部。

但在調用函數時,可以在一個函數中調用另一個函數,這就是函數的嵌套調用。接下來我們通過一個案例來演示函數的嵌套調用。

案例一:


 

運行結果:


 

在這個案例中,main()函數中調用了 max4()函數,max4()函數中又調用了max2()函數。

為了讓大家能夠更好地理解這個程序執行的流程,我們通過一張圖來描述:


 

這張圖展示了程序中含有三層函數調用嵌套的情形,總共分為9個步驟,具體如下:

    (1) 執行main()函數的開頭部分;

    (2) 遇到函數調用語句,調用max4()函數,流程轉向max4()函數入口;

    (3) 執行max4()函數的開頭部分;

    (4) 遇到函數調用語句,調用max2()函數,流程轉向max2()函數入口;

    (5) 執行max2()函數,如果再無其他嵌套的函數,則完成max2()函數的全部操作;

    (6) 返回到max2()函數中調用max4函數的位置;

    (7) 繼續執行max4()函數中尚未執行的部分,直到max4()函數結束;

    (8) 返回main()函數中調用max4()函數的位置;

    (9) 繼續執行main()函數的剩余部分直到結束。

& 多學一招:函數調用時最多可以嵌套多少層?

大家肯定會問:“既然函數嵌套調用和普通的調用看上去沒什么區別,那是不是可以進行無限層的函數嵌套調用呢?”

很遺憾,函數可以嵌套調用多少層是由程序運行時一個名為“棧”的數據結構決定的。

一般而言,Windows上程序的默認棧大小大約為8KB,每一次函數調用至少占用8個字節,因此粗略計算下,函數調用只能嵌套大約一千層,如果嵌套調用的函數里包含許多變量和參數,實際值要遠遠小於這個數目。

當然,單純手動書寫代碼寫出一千層嵌套函數調用基本是不可能的,但是一種名為“遞歸”的方法可以輕松達到這個上限。

 

四、遞歸調用

在數學運算中,會遇到計算多個連續自然數之間的和的情況。

例如要計算1~n之間自然數之和,就需要先計算1加2的結果,用這個結果加3再得到一個結果,用新得到的結果加4,以此類推,直到用1~(n-1)之間所有數的和加n。

在程序開發中,要想完成上述功能,就需要使用函數的遞歸調用,所謂的遞歸調用就是函數內部調用自身的過程。

需要注意的是,遞歸必須要求有結束條件,不然就會陷入無限遞歸的狀態,永遠無法結束調用。接下來通過一個計算自然數之和的案例來學習遞歸調用。

案例二:


 

運行結果:


 

案例二中,我們定義了一個getsum()函數用於計算1~n之間自然數之和。

案例中的第9行代碼相當於在getsum()函數的內部調用了自身,這就是函數的遞歸,整個遞歸過程在n==1時結束。

由於函數的遞歸調用過程很復雜,接下來通過一個圖例來分析整個調用過程。


 

這張圖中描述了遞歸調用的過程,整個遞歸過程中getsum()函數被調用了4次,每次調用時,n的值都會遞減。

當n的值為1時,所有遞歸調用的函數都會以相反的順序相繼結束,所有的返回值會進行累加,最終得到的結果為10。


 

最后,不管你是轉行也好,初學也罷,進階也可,如果你想學編程~

【值得關注】我的 C/C++編程學習交流俱樂部!【點擊進入】

問題答疑,學習交流,技術探討,還有超多編程資源大全,零基礎的視頻也超棒~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM