跳转至

第九章 函数

函数是C语言中的构建块,本质上就是一个由语句组成的小程序。有了函数,程序就可以被划分成许多小块。


函数的定义和调用

由一个案例说明函数中的一些基本概念:

double average(double a, double b)
{
    return (a + b) / 2;
}

返回类型:即函数开始处放置的double,表示每次调用该函数返回的类型。

形式参数(parameter):标识符a和b

函数体:花括号里的内容。

实际参数(argument):调用函数时,传递给形式参数的表达式。

函数定义

函数定义的一般格式:

返回类型 函数名(形式参数)
{
    声明
    语句
}

如果返回类型很长,可以把它单独放到一行。

C89标准中,声明必须放在语句之前。

函数调用

这样调用函数:

average(x, y);

注意,圆括号不能省略,否则无法正确调用。

返回类型若非void,则会返回一个临时值,这个值可以保存到变量里,也可以丢弃。

实际参数

形式参数(parameter)出现在函数的定义中,表示函数调用时要提供的值。

实际参数(argument)是出现在函数调用中的表达式。

实际参数是通过值传递的。形参是实参的副本。

实际参数的转换

形参和实参的类型不一致时,会发生转换。应该先声明函数原型,然后再执行调用。

这种转换属于隐式转换。实际参数将会转换成形式参数的类型。

数组型实际参数

数组名可以作为函数的参数,但是函数无法得知数组的长度,只能传递第二个参数以表明长度。

通过此数组名就可以访问数组元素了。

如果形式参数是多维数组,那么必须指明列的长度:

void sum(arr[][LEN], int n);

但这种用法比较少见。

return语句

非void的函数必须用return语句来指定要返回的值:

return 表达式;

如果表达式的值得类型与返回值的类型不一致,那么会把表达式的值转换成返回值的类型。

程序终止

在main函数中执行return可以终止程序。

main函数的返回值是状态码,用于提供给操作系统,以表明程序的执行结果。正常结束返回0,异常结束返回非0值。

exit函数

另一种终止程序的办法是使用exit函数。此函数属于<stdlib.h>头。

传递给exit的参数就是程序结束的状态码:

exit(0); // 正常终止
exit(EXIT_SUCCESS); // 正常终止,此值为0
exit(EXIT_FAILURE); // 异常终止,此值为1

递归

如果函数调用它自己,那么此函数就是递归的(recursive)。

为了防止无限递归,一定要有一个终止递归的条件。