人們在求解一個復雜問題時,通常采用的是逐步分解、分而治之的方法,也就是把一個復雜的大問題分解成若干個比較容易求解的小問題,然后分別求解。類似地,程序員在設計一個復雜的程序時,往往也是把整個程序劃分成若干個功能較為單一且相對獨立的子程序,然后分別予以實現,最后再把所有的子程序像搭積木一樣裝配起來。
過程和函數是兩類不同的子程序。一個過程是參數化計算的語句序列,一般沒有返回值。函數在結構上類似于過程,但一個函數通常有一個返回值.在C,C++等語言中,過程和函數被統一為函數這一種形式。
在程序中使用函數時,需要定義函數和調用函數。每種程序設計語言都會提供關于函數定義和調用的相應規則。函數定義描述了函數做什么和怎么做,函數調用則是使用已經定義的函數。
1.函數定義
一個函數的定義通常由兩部分構成:函數首部和函數體。函數首部給出了一個契約說明了如何使用一個函數;P數體則用語句描述了函數的具體功能和實現細節。函數定義的一般格式是:
返回值的類型函數名(形參表),/函數首部
{
函數體;
}
數首部說明了函數返回值的數據類型、函數的名字和函數運行時所需的參數(稱為形參)及其類型。函數所實現的功能在函數體部分描述。
2.函數調用
在一個函數(稱為調用函數)中需要使用另一個函數(稱為被調用函數)已經實現的功能時,便以名字和參數進行調用,稱為函數調用。在使用一個函數時,只要知道如何調用就可以了,并不需要關心被調用函數的內部實現。因此,調用函數需要給出被調用函數的名字、向被調用函數傳遞的參數(實參)以及如何處理返回值等。
函數調用的一般形式為:
函數名(實參表);
實現函數調用時,系統要作一系列的處理,包括保存現場、實參傳遞、控制轉人被調用函數等,調用完成后需要恢復現場、傳遞返回值、控制轉回調用函數。
表7-4是一個函數定義和函數調用的例子,其中,函數power的功能是求解實數x的k次方。

函數調用的含義如圖7-7所示,其中,調用函數caller在其語句“y = power(a,4);”中調用了函數power.因此,在caller的執行過程中,執行到該函數調用時,將實參a和4的值傳遞給形參x和k,控制流轉人函數power開始執行,遇到return p時計算返回值,power執行結束.此后,控制流再返回調用函數caller并將返回值傳給y,接著執行caller中“Y=power(a,4) ;”之后的語句。

3.參數與參數傳遞
在程序中使用函數時,參數起著調用函數與被調用函數之間的信息傳遞作用。通常有兩類參數:形式參數和實際參數。形式參數(Parameter,簡稱為形參)出現在函數定義時的函數首部,在形式上以代表著某些量的特征參數的方式出現;實際參數(Argument,簡稱為實參)出現在函數調用中,它們對應于形式參數的具體內容。
例如,在前面關于函數power的定義中,函數首部為“double power(double x, int k)",其中,x和k就是形參。函數調用power(3. 5,4)實現計算3. 54 , 3.5和4則是實參.函數調用power(a, m)則實現計算am, a和m是實參,需將實參變量a的值傳遞給形參x,實參變量m的值傳遞給形參k。在調用時.實參a和m必須具有確定的值。
函數的實參與形參是相對應的。實現函數調用時,實參要向形參傳遞值。參數傳遞指的是在函數調用時實參與形參的匹配動作。如果由實參向形參傳遞值,相應的調用就稱為傳優調用;如果傳遞的是實參的地址(或者通過引用傳遞),則稱為引用調用。下面以實現兩個整型變It交換值的函數為例,簡要說明傳值調用和引用調用方式下的參數傳遞問題,其中swapl采用的是傳值調用,swap2采用的是引用調用,它們的定義和調用如表7-5所示。

在傳值調用方式中,形參將取得實參的值。在這種方式下,形參與實參分別對應不同的存儲單元.以函數swapl為例,在函數調用語句swapl (a, b)得到執行之前,系統還沒有為形參分配存儲單元,如圖7-8(a)所示。函數調用語句執行時,系統為形參x,y分配存儲單元,實參a和b的值分別傳遞給形參x和y。在函數swapl執行時,確實將x和y的值作了交換,但此時x與a無關、y與b無關,所以a和b的值并沒有得到交換,如圖7-8 (c)所示.實際卜,被調用函數執行結束后,形參的存儲空間就被系統回收了。

在引用調用方式下,形參表示的是實參的存儲位置,形參可以看成是實參之存儲位置的代名詞。因此,在函數swap2中,交換x與Y的值就等同于交換a與b的值,調用結束后實現了對a和b值的交換處理。
4.標準庫函數
編寫程序時,并不需要也不應當一切都從頭開始,而應當盡可能地利用前人的成果,以提高開發的速度和質量。為此,每種程序設計語言在發布時都包含了一些隨程序開發環境提供的函數庫,供編程人員開發程序時調用,如C語言的標準庫等。由編譯程序開發商和第三方提供的函數庫,實現了許多公用的或常用的功能,這些函數在準確性、高效性和可移植性方面更有保證。
存放在函數庫中的函數稱為庫函數.庫函數具有明確的功能、人口參數和返回值。
函數庫以文件方式提供。例如,擴展名為lib或dll的文件通常就是某種函數庫。