您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關函數可以嵌套定義但不能嵌套調用嗎的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
錯,函數可以嵌套調用但不可以嵌套定義。在C語言中,所有的函數都是平行的,即在定義函數時是互相獨立的,一個函數并不從屬于另一個函數,即函數不能嵌套定義,但可以互相調用,但不能調用main函數。
錯,函數可以嵌套調用但不可以嵌套定義。
C語言 函數
函數是一段可以重復使用的代碼,用來獨立地完成某個功能,它可以接收用戶傳遞的數據,也可以不接收。接收用戶數據的函數在定義時要指明參數,不接收用戶數據的不需要指明,根據這一點可以將函數分為有參函數和無參函數。
將代碼段封裝成函數的過程叫做函數定義。
函數的定義
如果函數不接收用戶傳遞的數據,那么定義時可以不帶參數。如下所示:
dataType functionName(){ //body }
如果函數需要接收用戶傳遞的數據,那么定義時就要帶上參數。如下所示:
dataType functionName( dataType1 param1, dataType2 param2 ... ){ //body }
dataType
是返回值類型,它可以是C語言中的任意數據類型,例如 int、float、char 等。
functionName
是函數名,它是標識符的一種,命名規則和標識符相同。函數名后面的括號( )不能少。
dataType1 param1, dataType2 param2 ...
是參數列表。函數可以只有一個參數,也可以有多個,多個參數之間由,分隔。參數本質上也是變量,定義時要指明類型和名稱。與無參函數的定義相比,有參函數的定義僅僅是多了一個參數列表。
body
是函數體,它是函數需要執行的代碼,是函數的主體部分。即使只有一個語句,函數體也要由{ }包圍。
如果有返回值,在函數體中使用 return 語句返回。return 出來的數據的類型要和 dataType 一樣。
return是C語言中的一個關鍵字,只能用在函數中,用來返回處理結果。
示例:
#include <stdio.h> int sum(){ int i, sum=0; for(i=1; i<=100; i++){ sum+=i; } return sum; } int main(){ int a = sum(); printf("The sum is %d\n", a); return 0; }
運行結果:
The sum is 5050
函數不能嵌套定義,main 也是一個函數定義,所以要將 sum 放在 main 外面。函數必須先定義后使用,所以 sum 要放在 main 前面。
注意:main 是函數定義,不是函數調用。當可執行文件加載到內存后,系統從 main 函數開始執行,也就是說,系統會調用我們定義的 main 函數。
教程
函數調用
所謂函數調用(Function Call),就是使用已經定義好的函數。函數調用的一般形式為:
functionName(param1, param2, param3 ...);
functionName 是函數名稱,param1, param2, param3 ...是實參列表。實參可以是常數、變量、表達式等,多個實參用逗號,分隔。
在C語言中,函數調用的方式有多種,例如:
//函數作為表達式中的一項出現在表達式中 z = max(x, y); m = n + max(x, y); //函數作為一個單獨的語句 printf("%d", a); scanf("%d", &b); //函數作為調用另一個函數時的實參 printf( "%d", max(x, y) ); total( max(x, y), min(m, n) );
函數的嵌套調用
函數不能嵌套定義,但可以嵌套調用,也就是在一個函數的定義或調用過程中允許出現對另外一個函數的調用。
【示例】計算sum = 1! + 2! + 3! + ... + (n-1)! + n!
分析:可以編寫兩個函數,一個用來計算階乘,一個用來計算累加的和。
#include <stdio.h> //求階乘 long factorial(int n){ int i; long result=1; for(i=1; i<=n; i++){ result *= i; } return result; } // 求累加的和 long sum(long n){ int i; long result = 0; for(i=1; i<=n; i++){ //在定義過程中出現嵌套調用 result += factorial(i); } return result; } int main(){ printf("1!+2!+...+9!+10! = %ld\n", sum(10)); //在調用過程中出現嵌套調用 return 0; }
運行結果:
1!+2!+...+9!+10! = 4037913
sum() 的定義中出現了對 factorial() 的調用,printf() 的調用過程中出現了對 sum() 的調用,而 printf() 又被 main() 調用,它們整體調用關系為:
main() --> printf() --> sum() --> factorial()
如果一個函數 A() 在定義或調用過程中出現了對另外一個函數 B() 的調用,那么我們就稱 A() 為主調函數或主函數,稱 B() 為被調函數。
當主調函數遇到被調函數時,主調函數會暫停,CPU 轉而執行被調函數的代碼;被調函數執行完畢后再返回主調函數,主調函數根據剛才的狀態繼續往下執行。
一個C語言程序的執行過程可以認為是多個函數之間的相互調用過程,它們形成了一個或簡單或復雜的調用鏈條。這個鏈條的起點是 main(),終點也是 main()。當 main() 調用完了所有的函數,它會返回一個值(例如return 0;)來結束自己的生命,從而結束整個程序。
函數是一個可以重復使用的代碼塊,CPU 會一條一條地挨著執行其中的代碼,當遇到函數調用時,CPU 首先要記錄下當前代碼塊中下一條代碼的地址(假設地址為 0X1000),然后跳轉到另外一個代碼塊,執行完畢后再回來繼續執行 0X1000 處的代碼。整個過程相當于 CPU 開了一個小差,暫時放下手中的工作去做點別的事情,做完了再繼續剛才的工作。
感謝各位的閱讀!關于“函數可以嵌套定義但不能嵌套調用嗎”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。