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;
}

执行时,程序进入无限循环。实际上,必须使用递归,以便程序最终终止。

广告