C語言中的使用者自定義函式



C語言中的函式是一塊組織良好的、可重用的程式碼塊,用於執行單個相關的操作。在任何C程式中,都存在一個或多個函式——分為庫函式和使用者自定義函式。

C語言中有兩種型別的函式:

  • 庫函式
  • 使用者自定義函式

任何C編譯器(例如GCC編譯器、Clang、MSVC編譯器等)都附帶一些預編譯的標頭檔案(stdio.hmath.h等),每個標頭檔案包含一個或多個預定義的庫函式,例如printf()scanf()pow()sqrt()等。為了能夠使用庫函式,必須使用#include指令提供相應的標頭檔案。

但是,如果您找不到合適的庫函式來滿足您的需求,則可以為程式定義一個自定義函式。通常,我們會發現一個C程式包含一個main()函式。顯然,main()函式是一個使用者自定義函式,因為它包含使用者提供的指令。當然,它也可以呼叫其他庫函式或使用者自定義函式。

什麼是C語言中的使用者自定義函式?

使用者自定義函式由使用者定義,用於執行特定任務以實現程式碼可重用性和模組化。要建立和使用使用者自定義函式,不需要使用任何內建庫。這些函式可以在同一個程式中建立,也可以在使用者自定義的標頭檔案中建立。

建立使用者自定義函式

要建立使用者自定義函式,首先需要了解函式的目的,即您希望函式執行什麼操作?

要建立使用者自定義函式,需要了解函式的以下三個部分:

  • 函式宣告
  • 函式定義
  • 函式呼叫

使用者自定義函式的宣告

在C語言中,必須提供任何函式原型的宣告。庫函式的原型位於相應標頭檔案中。

對於使用者自定義函式,其原型位於當前程式中。函式的定義及其原型宣告必須匹配。

語法

如果您希望定義一個名為add()的函式,該函式執行兩個整數引數的加法並將值作為整數返回,則函式宣告如下:

int add(int, int);

使用者自定義函式的定義

函式的定義及其原型宣告必須匹配。定義包含與宣告匹配的函式頭和函式體。

語法

return_type function_name(arg1, arg2, ...){

   // Function body;

   return val;

}

示例

使用此模板,您可以編寫如下所示的使用者自定義函式add():

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

請注意,在C程式中,使用者自定義函式的定義順序並不重要。但是,必須在呼叫函式之前宣告其原型。

在一個程式中,main()函式始終是入口點,無論它是第一個函式還是其他函式。我們不需要提供main()函式的原型宣告。

呼叫使用者自定義函式

要呼叫函式,應使用符合函式原型宣告的語句。如果函式被定義為接收一定數量的引數,則必須傳遞相同數量和型別的引數來呼叫該函式。

示例

以下語句呼叫我們上面定義的add()函式:

int result = add(10, 20);

使用者自定義函式示例

在此示例中,我們建立了兩個使用者自定義函式add()sub()來查詢給定數字的加法和減法。

// C program to demonstrate an example of
// user-defined function
#include <stdio.h>

// Function declarations
int add(int, int);
int sub(int, int);

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

int sub(int a, int b) {
  return (a - b);
}

int main() {
  // Declaring two integer variables to
  // store the numbers
  // and resultant variables to store the result
  int num1 = 36, num2 = 24;
  int res_add, res_sub;

  // Calling the functions
  res_add = add(num1, num2);
  res_sub = sub(num1, num2);

  // Printing the results
  printf("Addition is : %d\n", res_add);
  printf("Subtraction is : %d\n", res_sub);

  return 0;
}

Addition is : 60
Subtraction is : 12

使用者自定義函式中的形式引數和實際引數

當函式定義帶引數時,函式名前括號中的引數稱為形式引數。在上面的示例中,函式定義帶有“int a”和“int b”引數;它們是形式引數。

呼叫函式時,傳遞給它的引數稱為實際引數。在下面的示例中,變數“x”和“y”是實際引數。

int x = 10, y = 20;
int result = add(x, y);

使用者自定義函式可以定義為具有任何型別的變數作為形式引數。它包括基本型別(int、float、char)、陣列、指標或struct/union型別變數。

函式應向呼叫環境返回值。預設情況下,函式的返回型別為int型別。但是,它可以返回任何資料型別——基本型別、陣列、指標或結構體以及指標。您甚至可以定義一個返回void型別的函式。

示例

如果函式的前向宣告和定義中的實際引數和形式引數的數量或型別,或者返回型別不匹配,則編譯器會報告錯誤。

請看下面的例子:

#include <stdio.h>

float divide (int, int);

int main(){

   int x = 15, y = 5;

   float z = divide (x, y);
   
   printf("%f", z);

   return 0;
}

int divide (int a, int b){

   int c = a/b;

   return c;
}

輸出

在上面的程式碼中,divide()函式的宣告與其定義不匹配,因此編譯器顯示以下錯誤:

error: conflicting types for 'divide'

在C語言中,任何函式都可以呼叫任何其他函式,任何次數。函式也可以自己呼叫自己。這種自呼叫函式稱為遞迴函式

下面的程式從main()函式內部呼叫main()函式本身:

#include <stdio.h>

int main(){

   printf("Hello");

   main();

   return 0;
}

執行時,程式進入無限迴圈。實際上,必須使用遞迴,以便程式最終終止。

廣告