首頁 >常見問題 >函數可以巢狀定義但不能巢狀呼叫嗎

函數可以巢狀定義但不能巢狀呼叫嗎

青灯夜游
青灯夜游原創
2021-02-02 16:28:4234257瀏覽

錯,函數可以巢狀呼叫但不可以巢狀定義。在C語言中,所有的函數都是平行的,即在定義函數時是相互獨立的,一個函數並不從屬於另一個函數,即函數不能嵌套定義,但可以互相調用,但不能調用main函數。

函數可以巢狀定義但不能巢狀呼叫嗎

本教學操作環境:windows7系統、C99版本、Dell G3電腦。

錯,函數可以巢狀呼叫但不可以巢狀定義。

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 函數。

教學建議:《c語言教學影片

函數呼叫

所謂函數呼叫(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 開了一個小差,暫時放下手中的工作去做點別的事情,做完了再繼續剛才的工作。

更多電腦程式相關知識,請造訪:程式設計影片! !

以上是函數可以巢狀定義但不能巢狀呼叫嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn