函式簡介
什麼是函式?
函式是一連串 CPU 可以執行的命令之組合。
程式內的函式和數學裡的函式有何不同?
數學裡的函式,例如:
f(x) = 3.5 x^3 - 4 x^2 + 5.2
所著重的是自變數和因變數之間的關係,
強調自變數和因變數之間一對一或是多對一的特性,
等你完全暸解程式中的函式以後,
你會知道程式中的函式除了格式和數學中的函式很像之外,
不見得要給它某些數值去對應到另一些數值,
也不見得有一對一或是多對一的特性,
甚至有一對多的特性,
因此還是別比較了,
記得它是一堆 CPU 動作的組合就是了。
程式由函式組合而成
一個 C 程式是由許多函式組合起來的,
函式在處理某些複雜的動作時可以委請其它的函式來代勞,
因此函式可以說是適當分工的媒介。
程式由 main() 函式開始執行。
函式的宣告 (定義)
函式的宣告要具有下列要件:
-
函式傳回值的型態,例如:int
-
函式名稱,例如: main
-
函式參數,例如: (int argc, char *argv[])
-
函式主體,例如: {printf("Thi ... return 0;}
例如:
int main(int argc, char *argv[])
{
printf("This is a simple but mandary function!\n");
return 0;
}
函式的呼叫與使用
一個函式定義好以後就好像你訓練好的一個助手一樣,
你可以也必須將適當的工作交付給他,
讓他去幫你完成工作的細節。
這個工作交付的動作就叫做函式呼叫,
例如下面這一段程式呼叫 printf() 這個函式兩次:
printf("printf() helps output formatted string\n");
printf("printf() can habndle manu different arguments.\n");
就是請 printf() 這個在 stdio
函式庫中定義好的函式來幫忙把資料列印到螢幕上去,
函式呼叫必須先寫函式的名稱、
然後在後面跟著一對小括號、
括號裡面的我們稱為引數 (arguments),
是你請你的助手做事情時所交代給他的資料,
當然這些引數必須要和函式定義時的參數一致才行,
不能說你的助手說他不懂英文,
而你又非要交給他英文資料嘛!
對不對?
注意:
在上面解釋函式呼叫時,
將一個函式比擬為一個專做某些特殊事情的助手,
這個比喻會有一個大問題:
在現實生活中,
班代可以請總務全權獨立去負責所有班費相關的事務,
同時班代可以放心地去處理其它的事務;
但是在程式中呼叫一個函式時,
呼叫方的程式會暫停在那裡等待被呼叫的函式執行完所有的工作後才再繼續向下做下去,
並沒有辦法兵分二路各自執行。
這樣子的結果有一個很大的好處:
就是程式中有那麼多的函式會被執行,
但是主函式 main() 一定可以掌握究竟哪些函式已經完成了。
另一種解釋函式呼叫的方法則是由 CPU 的角度來看:
CPU 在任何一時間只能執行一個指令,
程式一開始的時候 CPU 由 main() 函式的第一列開始執行,
執行到某一個函式呼叫的時候 (例如:printf()),
CPU 立刻由 main() 函式轉而執行 printf() 函式內的第一列,
跟著函式內的邏輯一列一列地執行下去,
直到函式結束或是 return 敘述,
CPU 再回到剛才呼叫 printf() 的地方繼續執行下去,
如此依照 main() 函式內邏輯執行下去,
一直到函式結束或是 return 敘述或是 exit() 函式呼叫後程式才結束。
(上面講的 CPU 執行敘述的順序其實也就是一般所謂的控制流程。)