在 C 语言中,函数是一段具有特定功能的、可重复使用的代码块。它可以接收输入参数,进行一系列的操作,并可以返回一个结果。
当代码的行数较多时,经常会出现几乎重复的代码,为了避免了代码的重复,我们会将这部分拿出来,封装成函数。一次编写的函数可以在程序的不同地方多次调用,提高了开发效率。
在实际开发中,我们会将一个大型程序分解为多个小的、功能单一的函数,每个函数负责完成一个特定的任务。这样可以提高代码的可读性和可维护性,方便团队协作开发。
即在一个大程序中,会有很多个功能点,我们会在函数中完成这些功能点,一个函数通常完成一个功能,然后在主函数main中进行调用,其实函数也可以理解为一个子程序。
函数就分为两种:库函数与自定义函数。
库函数是编译器厂商根据ANSI提供的C语言标准给出的一系列函数实现,如printf、scanf等,可以直接调用。
自定义函数则由自己编写、完成自己所需的功能。需要定义、声明后才能调用。
#define _CRT_SECURE_NO_WARNINGS
#include
int add(int a, int b);
int main()
{
int a = 2;
int b = 3;
int sum = add(a, b);
int e = printf("%d\n", sum);
printf("%d\n", e);
return 0;
}
int add(int a, int b)
{
int c = a + b;
return c;
}
在上面的代码中,17~21行是一个自定义的函数,它的定义形式为:
我们可以把函数体看作工厂,把参数看作原料。原料通过工厂加工得到产品,参数通过函数体处理得到计算结果。
这个计算结果,可以返回,也可以不返回。如果你需要返回,就要去return 返回值;。return的返回值的类型,尽量与定义的返回值类型相同。如果不一致,那么系统会自动将返回的值隐式转换为函数的返回值类型。
什么是返回值?我们调用函数后,给变量赋值,赋的这个值就是返回值。在上面代码的第11行,我们调用函数add,并赋值给变量sum后,得到的值是5。这个5就是函数Add的返回值。
当然函数也可以没有返回值,此时返回值的类型是void。因为函数一定要有return语句作为函数的结束,没有就会出现编译错误,所以在返回值类型为return的情况下,直接return;即可。没有返回值,就不可以赋值给变量,对参数的处理结果不会直接体现在控制台上。
无论是自定义函数还是库函数可以有返回值。就如上面代码的第12行,我们将库函数printf的返回值赋值给变量e,将变量e打印出来后得到2,这个2就是函数printf的返回值。
当然我们调用库函数通常是使用它的功能,而不是它的返回值。
综上所述,函数的三个核心组成部分就是参数、函数体、返回值。由主函数输入的参数,通过函数体的处理后,得到一个计算结果。
这个结果可以通过 “rerturn 返回值;” 的形式返回,然后对变量进行赋值;但是,如果说这个计算结果不需要对变量赋值,也不需要直接体现在控制台上,也可以选择不返回,直接return;。
我们调用函数之前要进行声明。如果函数写在main函数前面,函数的定义即声明,不需要进行额外的声明;如果函数写在main函数后面,则需要一个额外的声明,如上面代码的第5行。声明的格式是——“返回值类型 函数名(参数);”。
声明后,我们就可以对函数进行调用,调用的格式是——“函数名(参数);”。
此时我们要知道,函数定义时的参数与函数调用时的参数是不一样的。函数调用时的参数,称为实际参数,即实参;函数定义时定义的参数称为形式参数,即形参。虽然说调用函数时,实参传递给了形参,进入函数进行处理,并且它们的值也一样。但是,它们占据的是两块不一样的内存空间。也就是说,如果我对形参进行操作,实参的值不会受到影响。
但是如果我传递的实参是数组,那么形参是不会创建新的数组的,形参操作的数组和实参的数组是同一个数组,此时一改全改。
我们在编程的时候,为什么会想到写这个函数的呢?就现在我们在做一个小游戏,你创建了一个main函数,然后第一步是建立一个选择界面,选择开始还是退出。那么这就是你第一个要实现的功能点,此时你就自然而然会想到通过函数去实现。
就是说为什么会想到写这个函数?因为我在实现我的项目的时候,我需要实现一个功能,而这个功能需要用函数去实现。