Cprogramming 简明教程

User-defined Functions in C

C 中的 function 是一个有组织的可重用代码块,用于执行一个相关的操作。在任何 C 程序中,都有一个或多个函数 − 分为库函数和用户定义函数。

在 C 中有两种类型的函数 −

  1. Library functions

  2. User-defined functions

任何 C 编译器(例如,GCC 编译器、Clang、MSVC 编译器等)都预编译一系列头文件( stdio.hmath.h 等)进行分发,每个文件包括一个或多个预定义库函数,例如 printf()scanf()pow()sqrt() 等。若要使用库函数,必须通过 #include 指令提供相应的文件。

但是,如果您找不到合适的库函数来达到您的目的,那么可以为该程序定义一个自定义函数。通常,我们发现一个包含 main() function 的 C 程序。显然,main() 函数是一个用户自定义函数,因为它包含用户提供的指令。它当然能够调用其他库或用户自定义函数。

What is User-Defined Function in C?

User-defined function 由用户定义,用于执行特定的任务以实现代码的可重用性和模块性。要创建和使用用户自定义函数,您不需要使用任何内置库。这些函数既可以在同一程序中创建,也可以在用户自定义的头文件中创建。

Creating a User-defined Function

若要创建用户自定义函数,首先需要了解该函数的目的,即,您想让该函数执行什么操作?

若要创建用户自定义函数,您需要了解该函数的以下三个部分:

  1. Function declaration

  2. Function definition

  3. Function calling

Declaration of User-defined Function

在 C 语言中,提供任何函数原型的声明是必要的。库函数的原型存在于相应的文件中。

对于用户自定义函数,其原型存在于当前程序中。函数的定义及其原型声明应匹配。

如果您希望定义一个名为 add() 的函数,该函数执行两个整数参数的加法并返回一个整数作为值,那么函数声明如下 −

int add(int, int);

Definition of User-defined Function

函数的定义及其原型声明应匹配。定义包括与声明和函数体匹配的函数头。

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() 函数的原型声明。

Calling a User-defined Function

若要调用该函数,您应使用符合函数原型声明的语句。如果该函数被定义为接受一定数量的参数,那么必须传递相同数量和类型的参数来调用该函数。

以下语句调用我们在上面定义的 add() 函数 −

int result = add(10, 20);

Example of User-Defined Function

在此示例中,我们会创建两个用户自定义函数 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

Formal and Actual Arguments in User-Defined Function

当函数使用参数定义时,函数名称前括号中的参数称为 formal arguments 。在上面的示例中,该函数使用“int a”和“int b”参数来定义;它们是形式参数。

当调用该函数时,传递给它的参数称为 actual arguments 。在下面的示例中,变量“x”和“y”是实际参数。

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

可以将用户自定义函数定义为具有任何类型的变量作为形式参数。它包括基本类型(int、float、char)、数组、指针或结构/联合类型变量。

函数应向调用环境返回一个值。默认情况下,函数的返回类型为 int 类型。但是,它可以返回任何数据类型 − 基本类型、数组、指针或者结构以及指针。您甚至可以定义返回 void 类型的函数。

Example

如果实际参数和形式参数的数量或类型或者返回类型与函数的前向声明及其定义中的不匹配,则编译器会报告错误。

请看以下示例 −

#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 中,任何函数都可以调用任何其他函数,次数不限。函数也可以调用自身。这种自调函数被称为 recursive function

以下程序从 main() 内部调用 main() 函数 −

#include <stdio.h>

int main(){

   printf("Hello");

   main();

   return 0;
}

执行时,程序进入无限循环。在实践中,必须使用 recursion ,以便程序最终终止。