内容正文:
第8章 函数
用户自定义函数
函数间的数据传递
函数的嵌套调用和递归调用
变量的存储类别
本章要点
** 一个C语言源程序通常由一个主函数和若干个子函数组成,各子函数之间的关系是平行的,因此不能嵌套定义,但能相互调用。一个C语言源程序无论包含了多少个函数,程序的执行总是从主函数main()开始,并终止于主函数main()。
** 通常将一个C语言源程序分解成一个或多个文件,这些文件可分别编写、编译、最后连接为一个 .EXE 文件。
** 从用户使用的角度将函数分
为两种:标准函数(库函数)和用户自定义函数。
8.1 用户自定义函数
8.1.1 用户自定义函数的定义
[类型标识符] 函数名([形式参数表])
{ [函数体] }
函数名:由用户命名,命名规则与标识符命名规则相同。
类型标识符: 定义了函数返回值的数据类型。当函数的返回值是整形或字符型,可省略类型标识符。当函数无返回值时,则类型标识符用void关键字。
形式参数表的一般形式为:
类型标识符 形参1,类型标识符 形参2,···
若省略形式参数表,则称为无参函数。否则称为有参函数。
函数体:包含了说明语句和执行语句。当函数无函数体时,则为空函数。
例8.1:编写一个求n! 的函数(n为整数)
long fac(int n)
{ long k=1;int i; /*定义一个累乘器 */
for( i=1; i<=n; i++)
k*=i;
return(k);
}
例8.2 编写一个打印30个*号的函数
void printstar ( )
{ int j;
for (j=1; j<=30; j++) printf(“*”) ;
}
所定义的函数有返回值、返回值的类型为长整型,有一个形参,参数类型为整型
所定义的函数无返回值,无形式参数
8.1.2 用户自定义函数的返回值
函数的返回值是通过return语句实现的。
格式:return(表达式);或 return 表达式;
语义:当函数执行到return语句时,程序的流程立即返回到调用该函数的地方(通常称为退出调用函数),并通过return语句返回函数值。return语句中表达式的值就是函数值。如果return语句不包含表达式,则返回一个不确定的函数值。
long fac(int n)
{ int i;long k;
for(i=1,k=1;i<=n;i++)
k=k*i;
return (k);}
如果函数有返回值,这个值就应该有一个确定的数据类型,所以在定义函数首部时应指定函数值的类型。
说明:
在同一个函数内可根据需要在多处设置return语句,函数执行过程中遇到任何一个return语句时,都将立即返回到调用该函数的地方。
如果需要从被调函数中带回一个确定的值,被调函数中必须包含return 语句。
如果函数中没有return语句,程序的流程一直执行到函数末尾的右花括号“}”处,然后返回到调用该函数的地方并返回一个不确定的、无用的函数值。
为了明确表示“不返回值”,可以用“void”定义“无类型”(或称“空类型”)函数。
max (int x, int y)
{
if (x>y) return x;
else return y;
}
printf(“***”);
8.1.3用户自定义函数的调用
1、函数的调用
函数调用的一般形式:函数名([实参表])
实参表:
可以是常量、变量或表达式。
其类型、顺序和个数必须与函数定义时形参表的一致。
对于无参函数,则省略实参,但括号不能省略。
函数的调用过程:
程序控制从主调函数转移到被调函数;
将实参的值按位置一一对应传递给形参;
从被调函数的第一条语句开始执行该函数各个语句;
在执行完所有语句或遇到return语句时,返回到主调函数中原来的调用处继续执行主调函数。
主函数 fun1 fun2
{... {... { ...
fun1( ); fun2( ) ...
... ... ...
... ...