Contents

C 函數簡介

您可能已經通過簡單的示例了解了基本的 C 語法,現在想知道如何創建更大的實際程序。首先,您需要將代碼組織成高效的部分,並儘量減少重複。在 C 中,與大多數語言一樣,問題的答案是函數。

利用 C 中的函數提供了一個無縫的過程,具有許多優點。功能的實現可以將復雜的應用程序分解為可管理的組件。此外,它們還有助於在主要項目以及附屬圖書館或獨立項目中進行回收。

為了開始,必須了解與函數聲明、原型實例化、參數規範和返回語句語法相關的概念。

C 中的函數是什麼?

/bc/images/an-introduction-to-c-functions.jpg

在 C 編程領域,函數可以理解為代碼的指定部分,在調用時執行特定任務。通過利用函數,代碼變得更加結構化和有組織,同時還可以重複特定操作而無需重複其實現。

手頭的主要實例由 main() 函數體現,它充當任何 C 程序的主要網關。此外,利用其他人預先制定的庫函數也是一個可行的選擇。或者,用戶可以選擇編寫自己的定制功能以滿足特定要求。

函數:聲明、定義和調用

函數的使用取決於三個關鍵要素,它們是函數應用的基石。

函數聲明

函數原型用於在完整定義之前提供有關函數名稱、返回類型和參數的信息。其目的是能夠在詳細規範之前使用該功能。函數原型的基本結構遵循以下格式:

 return_type function_name(parameters); 

在哪裡:

函數的返回類型表示返回值的數據分類,它可以包含任何合法的 C 數據結構,或者如果函數不產生結果值,則可以包含 null。

分配給功能實體的標識符用作所述功能的名稱,方便其在將來的時刻調用。

該函數的輸入參數以列表的形式表示,由數據類型和以逗號分隔的參數名稱組成。該列表稱為“參數”,用作功能輸入要求的指示。

例如,這是一個簡單的函數聲明:

 int add(int a, int b); 

函數定義

調用函數時,它執行其聲明中概述的指令,包括其標識符、返回類型、參數列表和管理其行為的代碼。語法遵循以下結構:

 return_type function_name(parameters) {
    // Function body - code that defines what the function does
    // Return a value if applicable
    return value;
} 

讓我們分解部分語法:

曲線括號 { } 內的語句語料庫構成了函數的主體,其中包含一系列指令,這些指令描述了函數在調用時的行為特徵。

當函數返回非 void 數據類型的值時,將使用 return 語句。該語句的目的是將返回值傳送回調用方,確保它符合指定的返回類型。

當然,這是用正確的英語優雅地演繹函數聲明:pythondefgreet(name):print(“Hello,”+name+“!”)

 int add(int a, int b) {
    int sum = a \+ b;
    return sum;
}

函數調用

本質上,正如在使用菜譜和各種原料準備菜餚時必須遵循特定步驟一樣,在調用函數時也需要仔細執行所提供的指令才能獲得成功的結果。調用函數的過程涉及為其提供指定的參數,該函數根據預定義的語法執行,如下所示:

 return_type result = function_name(arguments); 

參數是指在函數執行期間提供給函數的輸入參數。它們可以是單獨的值或表達式,並且必須用逗號分隔。確保參數的數量、順序和數據類型與函數參數列表中指定的完全對應非常重要。

當函數返回具有非 void 數據類型的值時,可以利用適當數據類型的變量來捕獲返回值。

這是函數調用的示例:

 #include <stdio.h>

// Function prototype
int add(int a, int b);

int main() {
    int x = 5, y = 3;

    // Call the function and store the result in 'sum'
    int sum = add(x, y);
    printf("The sum of %d and %d is %d\n", x, y, sum);
    return 0;
}

// Function definition
int add(int a, int b) {
    return a \+ b;
} 

通過遵循由三個階段組成的結構化方法-聲明函數的目的、詳細說明其執行過程以及利用合適的輸入參數調用它-人們可以有效地利用函數的功能來完成其編程工作中的各種操作。

函數參數和返回值

函數參數充當調用實體在調用期間提供的輸入值的容器,而返回值表示函數生成並傳送回請求發起者的結果。

傳遞參數的方法有兩種。

按值傳遞

在這種方法中,當調用函數時,它將實際參數的值傳輸到其相應的參數。對函數內部參數進行的更改不會影響初始參數。

例如:

 #include <stdio.h>

int square(int num) {
    num = num * num;
    return num;
}

int main() {
    int x = 5;
    int y = square(x);

    // Output: x and y after function call: 5 25
    printf("x and y after function call: %d %d\n", x, y);

    return 0;
} 

square 函數接受由變量“num”表示的數字輸入。

square 函數接受一個數字作為輸入,計算其平方根,相應地修改它,並返回更新後的結果。

這段代碼的主要目的是聲明一個變量“x”,它最初被分配一個整數值。

該代碼通過調用 square 函數並向其提供 x 的值作為參數來繼續。此操作之後是將結果輸出分配給名為 y 的輔助變量。

調用該函數後,主函數隨後輸出 x 和 y 的值。由於在“square”表示的操作中修改參數“num”,x的數值保持不變,因為這種調整對x的初始狀態沒有影響。

通過引用傳遞

通過將變量的內存地址(即指針)傳遞給函數,在該函數範圍內對所述變量所做的任何修改也將反映在該函數範圍之外的原始狀態。

編程語言 C 和 Python 等語言之間的一個顯著區別在於指針的使用,包括它們作為參數的函數。

 #include <stdio.h>

void square(int *num) {
    *num = *num * *num;
}

int main() {
    int x = 5;
    square(&x);

    // Output: x after function call: 25
    printf("x after function call: %d\n", x);
    return 0;
} 

square 函數接受整數指針作為其輸入參數,由變量“num”表示。該函數不產生任何返回值。

square 函數接受一個數字作為輸入,通過將其與自身相乘來計算其平方,然後使用解引用運算符 (\*) 更新傳遞給函數的參數所指向的內存中存儲的值。

此代碼片段的主要目的是創建一個名為“x”的新整數變量並將其初始值初始化為 5。

該代碼繼續取消引用指向“x”的指針,並將其地址(通過使用地址運算符“&”獲得)作為參數傳遞給“square()”函數。

在調用“square”函數之後,主執行序列繼續打印變量“x”的當前值,該值已在函數內更新,現在的數值為 25。 “square”函數對原始“*num”參數所做的修改為變量“x”產生了這個結果。

從本質上講,這兩種方法的主要區別在於,當函數內修改參數時,它們對函數外原始值的影響。按值傳遞的方法會導致創建副本,而按引用或指針傳遞則可以直接操作初始值。

其他編程語言經常擁有與 C 指針對應的指針;然而,它們的功能本質上往往更先進。例如,C# 語言提供對“out”變量的支持,作為指定值應按引用而不是按值傳遞的一種方式。

空函數

C 編程語言中缺少定義的返回值的函數可以歸類為 void 函數。這些函數的目的是執行操作或完成任務,而無需產生結果。儘管 void 函數可以利用引用傳遞來修改其輸入參數,但這不是強制性要求。

這是一個 void 函數的示例:

 #include <stdio.h>

// Void function with no parameters
void greet() {
    printf("Hello, All Things N!");
}

int main() {
    // Call the void function, output: "Hello, All Things N!"
    greet();

    return 0;
} 

空函數是執行操作(例如執行命令、顯示通知、操作信息和實現目標)的有效手段,而無需檢索特定結果。

探索 C 編程中的函數

通過主動創建函數可以提高對 C 編程的理解和熟練程度。這不僅提高了代碼的清晰度和可維護性,而且還擴展了跨不同場景應用功能的多功能性。建議探索各種基於功能的應用程序以獲得最佳效益。

一旦您徹底了解了基本的 C 編程技術並尋求進一步的智力刺激,探索遞歸邏輯可能是您下一步的合適選擇。