C語言函數(shù)調(diào)用基礎(chǔ)應(yīng)用詳解
所謂函數(shù)調(diào)用(Function Call),就是使用已經(jīng)定義好的函數(shù)。函數(shù)調(diào)用的一般形式為:
functionName(param1, param2, param3 ...);
functionName 是函數(shù)名稱,param1, param2, param3 ...是實參列表。實參可以是常數(shù)、變量、表達式等,多個實參用逗號,分隔。
在C語言中,函數(shù)調(diào)用的方式有多種,例如:
//函數(shù)作為表達式中的一項出現(xiàn)在表達式中 z =max(x, y); m = n +max(x, y); //函數(shù)作為一個單獨的語句 printf("%d", a); scanf("%d",&b); //函數(shù)作為調(diào)用另一個函數(shù)時的實參 printf("%d",max(x, y)); total(max(x, y),min(m, n));
函數(shù)的嵌套調(diào)用
函數(shù)不能嵌套定義,但可以嵌套調(diào)用,也就是在一個函數(shù)的定義或調(diào)用過程中允許出現(xiàn)對另外一個函數(shù)的調(diào)用。
【示例】計算sum = 1! + 2! + 3! + ... + (n-1)! + n!
分析:可以編寫兩個函數(shù),一個用來計算階乘,一個用來計算累加的和。
#include<stdio.h> //求階乘 longfactorial(int n){ int i; long result=1; for(i=1; i<=n; i++){ result *= i; } return result; } // 求累加的和 longsum(long n){ int i; long result =0; for(i=1; i<=n; i++){ //在定義過程中出現(xiàn)嵌套調(diào)用 result +=factorial(i); } return result; } intmain(){ printf("1!+2!+...+9!+10! = %ld\n",sum(10));//在調(diào)用過程中出現(xiàn)嵌套調(diào)用 return0; }
運行結(jié)果:
1!+2!+...+9!+10! = 4037913
sum() 的定義中出現(xiàn)了對 factorial() 的調(diào)用,printf() 的調(diào)用過程中出現(xiàn)了對 sum() 的調(diào)用,而 printf() 又被 main() 調(diào)用,它們整體調(diào)用關(guān)系為:
main() --> printf() --> sum() --> factorial()
如果一個函數(shù) A() 在定義或調(diào)用過程中出現(xiàn)了對另外一個函數(shù) B() 的調(diào)用,那么我們就稱 A() 為主調(diào)函數(shù)或主函數(shù),稱 B() 為被調(diào)函數(shù)。
當主調(diào)函數(shù)遇到被調(diào)函數(shù)時,主調(diào)函數(shù)會暫停,CPU 轉(zhuǎn)而執(zhí)行被調(diào)函數(shù)的代碼;被調(diào)函數(shù)執(zhí)行完畢后再返回主調(diào)函數(shù),主調(diào)函數(shù)根據(jù)剛才的狀態(tài)繼續(xù)往下執(zhí)行。
一個C語言程序的執(zhí)行過程可以認為是多個函數(shù)之間的相互調(diào)用過程,它們形成了一個或簡單或復(fù)雜的調(diào)用鏈條。這個鏈條的起點是 main(),終點也是 main()。當 main() 調(diào)用完了所有的函數(shù),它會返回一個值(例如return 0;)來結(jié)束自己的生命,從而結(jié)束整個程序。
函數(shù)是一個可以重復(fù)使用的代碼塊,CPU 會一條一條地挨著執(zhí)行其中的代碼,當遇到函數(shù)調(diào)用時,CPU 首先要記錄下當前代碼塊中下一條代碼的地址(假設(shè)地址為 0X1000),然后跳轉(zhuǎn)到另外一個代碼塊,執(zhí)行完畢后再回來繼續(xù)執(zhí)行 0X1000 處的代碼。整個過程相當于 CPU 開了一個小差,暫時放下手中的工作去做點別的事情,做完了再繼續(xù)剛才的工作。
從上面的分析可以推斷出,在所有函數(shù)之外進行加減乘除運算、使用 if...else 語句、調(diào)用一個函數(shù)等都是沒有意義的,這些代碼位于整個函數(shù)調(diào)用鏈條之外,永遠都不會被執(zhí)行到。C語言也禁止出現(xiàn)這種情況,會報語法錯誤,請看下面的代碼:
#include<stdio.h> int a =10, b =20, c; //錯誤:不能出現(xiàn)加減乘除運算 c = a + b; //錯誤:不能出現(xiàn)對其他函數(shù)的調(diào)用 printf("csdn.net"); intmain(){ return0; }
到此這篇關(guān)于C語言函數(shù)調(diào)用基礎(chǔ)應(yīng)用詳解的文章就介紹到這了,更多相關(guān)C語言函數(shù)調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中Operator類型強制轉(zhuǎn)換成員函數(shù)解析
轉(zhuǎn)換函數(shù)定義了由<類型說明符1>到<類型說明符2>之間的映射關(guān)系??梢?,轉(zhuǎn)換函數(shù)是用來將一種類型的數(shù)據(jù)轉(zhuǎn)換成為另一種類型2013-09-09