在前面已经介绍过,C源程序是由函数组成的。虽然在前面各章的程序中大都只有一个主函数 main(),但实用程序往往由多个函数组成。
函数是C源程序的基本模块,通过对函数模块的调用实现特定的功能。C语言中的函数相当于其它高级语言的子程序。C语言不仅提供了极为丰富的库函数(如 Turbo C,MS C 都提供了三百多个库函数),还允许用户建立自己定义的函数。用户可把自己的算法编成一个个相对独立的函数模块,然后用调用的方法来使用函数。可以说C程序的全部工作都是由各式各样的函数完成的,所以也把C语言称为函数式语言。

C 语言函数的主要构成包括以下几个部分:
-
返回类型
函数的返回类型指定了该函数返回值的数据类型。如果函数不返回任何值,返回类型为void
。 -
函数名称
函数名称是函数的标识符,用来调用该函数。函数名称应该具备描述性,以便表明其功能。 -
参数列表
参数列表是函数定义中小括号()
中的部分。它可以为空,也可以包含一个或多个参数。参数用于向函数传递输入数据。每个参数都有类型和名称,且各个参数之间用逗号分隔。 -
函数体(代码块)
函数体是用花括号{}
包围的代码块。它包含了函数的具体实现部分,即完成特定任务的代码。函数体中的代码会在调用函数时执行。
C语言函数的基本语法格式:
return_type function_name(parameter1, parameter2, ...) { // 函数体 // 执行特定的任务 return value; // 如果有返回值 }
例子:
#include <stdio.h> // 返回类型为 int 的函数,接受两个 int 类型的参数 int add(int a, int b) { return a + b; // 返回 a 和 b 的和 } int main() { int result = add(5, 3); // 调用 add 函数 printf("The result is: %d\n", result); return 0; }
在上面的例子中:
- 返回类型:
int
,表示函数返回一个整数。 - 函数名称:
add
。 - 参数列表:
int a, int b
,表示该函数接受两个整数作为参数。 - 函数体:
return a + b;
,这是函数的具体实现,它返回a
和b
的和。
关键点总结:
- 返回类型:指定函数返回的值的类型,或者
void
表示无返回值。 - 函数名:用来标识并调用函数。
- 参数列表:用于接收传递给函数的数据,允许函数处理不同的输入。
- 函数体:包含执行任务的代码,决定了函数的行为。
这些构成要素共同定义了一个完整的 C 语言函数。
在C语言中可从不同的角度对函数分类。
1. 从函数定义的角度看,函数可分为库函数和用户定义函数两种:
- 库函数:由C系统提供,用户无须定义,也不必在程序中作类型说明,只需在程序前包含有该函数原型的头文件即可在程序中直接调用。在前面各章的例题中反复用到 printf、scanf、getchar、putchar、gets、puts、strcat 等函数均属此类;
- 用户定义函数:由用户按需要写的函数。对于用户自定义函数,不仅要在程序中定义函数本身,而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。
2. C语言的函数兼有其它语言中的函数和过程两种功能,从这个角度看,又可把函数分为有返回值函数和无返回值函数两种。
- 有返回值函数:此类函数被调用执行完后将向调用者返回一个执行结果,称为函数返回值。如数学函数即属于此类函数。由用户定义的这种要返回函数值的函数,必须在函数定义和函数说明中明确返回值的类型;
- 无返回值函数:此类函数用于完成某项特定的处理任务,执行完成后不向调用者返回函数值。这类函数类似于其它语言的过程。由于函数无须返回值,用户在定义此类函数时可指定它的返回为“空类型”, 空类型的说明符为“void”。
3. 从主调函数和被调函数之间数据传送的角度看又可分为无参函数和有参函数两种
- 无参函数:函数定义、函数说明及函数调用中均不带参数。主调函数和被调函数之间不进行参数传送。此类函数通常用来完成一组指定的功能,可以返回或不返回函数值;
- 有参函数:也称为带参函数。在函数定义及函数说明时都有参数,称为形式参数(简称为形参)。在函数调用时也必须给出参数,称为实际参数(简称为实参)。进行函数调用时,主调函数将把实参的值传送给形参,供被调函数使用。
4. C语言提供了极为丰富的库函数,这些库函数又可从功能角度作以下分类
- 字符类型分类函数:用于对字符按 ASCII 码分类:字母,数字,控制字符,分隔符,大小写字母等;
- 转换函数:用于字符或字符串的转换;在字符量和各类数字量(整型,实型等)之间进行转换;在大、小写之间进行转换;
- 目录路径函数:用于文件目录和路径操作;
- 诊断函数:用于内部错误检测;
- 图形函数:用于屏幕管理和各种图形功能;
- 输入输出函数:用于完成输入输出功能;
- 接口函数:用于与 DOS,BIOS 和硬件的接口;
- 字符串函数:用于字符串操作和处理;
- 内存管理函数:用于内存管理;
- 数学函数:用于数学函数计算;
- 日期和时间函数:用于日期,时间转换操作;
- 进程控制函数:用于进程管理和控制;
- 其它函数:用于其它各种功能。
以上各类函数不仅数量多,而且有的还需要硬件知识才会使用,因此要想全部掌握则需要一个较长的学习过程。应首先掌握一些最基本、最常用的函数,再逐步深入。由于课时关系,我们只介绍了很少一部分库函数,其余部分读者可根据需要查阅有关手册。

还应该指出的是,在C语言中,所有的函数定义,包括主函数 main 在内,都是平行的。也就是说,在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定义。但是函数之间允许相互调用,也允许嵌套调用。习惯上把调用者称为主调函数。函数还可以自己调用自己,称为递归调用。
main 函数是主函数,它可以调用其它函数,而不允许被其它函数调用。因此,C程序的执行总是从 main 函数开始,完成对其它函数的调用后再返回到 main 函数,最后由 main函数结束整个程序。一个C源程序必须有,也只能有一个主函数 main。
为什么需要函数?
在 C 语言中,函数的使用有以下几个重要的原因:
- 代码重用:通过函数,程序员可以将常用的代码封装在一个函数中,这样就能在不同的地方多次调用,而无需重复编写相同的代码。这不仅提高了效率,也减少了错误的可能性。
- 提高可读性和组织性:函数将代码分割成多个小的、功能明确的模块,使得程序结构更加清晰和易于理解。每个函数实现特定的功能,程序的逻辑层次更加分明。
- 减少复杂度:将复杂的问题拆分成多个小问题,通过函数来解决每个小问题。这样可以让程序更加简洁、易于维护和调试。
- 便于调试和测试:每个函数通常实现单一功能,因此可以单独测试和调试。这样,有问题时,可以迅速定位到具体的函数,而不需要分析整个程序。
- 递归功能:函数支持递归调用,允许一个函数调用自身。这对于解决一些复杂的数学和算法问题(例如,树遍历、阶乘计算等)非常有用。
- 参数传递:函数允许将不同的数据作为参数传递,使得函数能够处理不同的输入,增加了灵活性和扩展性。
总的来说,函数是 C 语言编程中的一个核心概念,帮助程序员将程序逻辑模块化,提高代码的可读性、可维护性和复用性。
C语言函数的重要性
C 语言函数的重要性体现在以下几个方面:
1. 提高代码复用性
- 避免重复代码:通过将常见操作封装成函数,程序员只需要编写一次代码,然后可以在程序中的多个地方调用这个函数。这样不仅减少了代码的重复,也提高了开发效率。
- 修改便捷:当需要修改某一功能时,只需修改函数内部的代码,程序中的所有调用该函数的地方都会自动更新,从而避免了对每个重复代码的修改。
2. 增强代码可读性和可维护性
- 结构清晰:函数将代码分解为模块化的块,每个函数负责特定的任务,使得程序结构更加清晰。函数名通常具有描述性,能直接表明该函数的作用,这提高了代码的可读性。
- 易于理解:通过合理划分函数,每个函数的功能单一,程序员可以更容易理解每部分代码的功能,降低了阅读和维护的难度。
3. 减少程序的复杂度
- 模块化设计:函数将复杂的程序分解为多个小的、易于管理的部分。每个函数可以独立完成某项任务,这样整个程序的复杂度被降低。函数通过接口与其他部分进行交互,使得整体设计更加模块化和灵活。
- 递归调用:函数支持递归,这意味着一个函数可以调用自身。这对于某些算法(如树的遍历、快速排序等)非常有效,帮助解决一些复杂的数学或计算问题。
4. 便于调试和测试
- 独立测试:由于函数是独立的模块,程序员可以对每个函数进行单独测试,这样可以更容易地找出程序中的问题和错误。每个函数的功能明确,测试时可以集中精力验证每个功能块。
- 局部调试:函数可以隔离程序中的错误,使得调试更加高效。若函数出现问题,只需要调试该函数而不是整个程序。
5. 提高程序的灵活性
- 参数传递:函数允许通过参数传递数据,这使得函数更加灵活,可以处理不同的输入,产生不同的输出。参数传递也让函数变得更加通用,不需要每次都编写新的代码。
- 返回值:函数可以返回值,根据不同的输入返回不同的结果,使得函数在多种场合下都能灵活使用。
6. 代码组织与协作
- 团队协作:当开发一个大型程序时,不同的程序员可以在不同的函数上工作,模块化的设计可以避免冲突,提高开发效率。每个函数都是相对独立的,团队成员可以并行开发。
- 代码复审和优化:函数化的代码更容易进行代码复审,因为每个函数负责一个明确的功能。优化时,也可以只关注影响性能的关键函数,而不必遍历整个程序。
7. 支持高级编程技术
- 递归编程:函数支持递归调用,这是解决一些问题(如树形结构遍历、图算法等)不可或缺的工具。
- 回调函数:C 语言的函数指针支持回调函数,这使得程序能根据需要动态选择执行的函数,常用于事件驱动编程和多态实现。
8. 优化代码执行
- 局部变量:每个函数有自己独立的局部变量,避免了不同函数之间的变量冲突,这增强了程序的健壮性。
- 减少内存使用:通过函数传递参数而不是使用全局变量,减少了内存的占用,并且减少了不同部分之间的耦合。
总结:
函数在 C 语言中的重要性不可忽视。它通过提供代码复用、结构清晰、易于维护、减少复杂度等优势,使得程序更加高效、灵活、易于管理。它是现代软件开发中的核心概念,尤其在大型项目和团队协作中,函数的优势尤为明显。