函数的声明是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便调用函数时系统进行对照检查。函数的声明后面要加分号。
如果声明的函数在文件内部,则声明时不用extern,如果声明的函数不在文件内部,而在另一个文件中,声明时须带extern,指明使用的函数在另一个文件中。
【例4-23】函数的使用
#include <reg52.h> //包含特殊功能寄存器库
#include <stdio.h> //包含I/O函数库
int max(int x,int y); //对max函数进行声明
void main(void) //主函数
{
int a,b;
SCON=0x52; //串口初始化
TMOD=0x20;
TH1=0XF3;
TR1=1;
scanf(“please input a,b:%d,%d”,&a,&b);
printf(“\n”);
printf(“max is:%d\n”,max(a,b));
while(1);
}
int max(int x,int y)
{
int z;
z=(x>=y?x:y);
return(z);
}
【例24】 外部函数的使用
程序serial_initial.c
#include <reg52.h>//包含特殊功能寄存器库
#include <stdio.h> //包含I/O函数库
void serial_initial(void) //主函数
{
SCON=0x52; //串口初始化
TMOD=0x20;
TH1=0XF3;
TR1=1;
}
程序y1.c
#include <reg52.h>//包含特殊功能寄存器库
寄存器库
#include <stdio.h> //包含I/O函数库
extern serial_initial();
void main(void)
{
int a,b;
serial_initial();
scanf(“please input a,b:%d,%d”,&a,&b);
printf(“\n”);
printf(“max is:%d\n”,a>=b?a:b);
while(1);
}
一.函数的嵌套
在一个函数的调用过程中调用另一个函数。C51编译器通常依靠堆栈来进行参数传递,堆栈设在片内RAM中,而片内RAM的空间有限,因而嵌套的深度比较有限,一般在几层以内。如果层数过多,就会导致堆栈空间不够而出错。
【例25】 函数的嵌套调用
#include <reg52.h> //包含特殊功能寄存器库
#include <stdio.h> //包含I/O函数库
extern serial_initial();
int max(int a,int b)
{
int z;
z=a>=b?a:b;
return(z);
}
int add(int c,int d,int e,int f)
{
int result;
result=max(c,d)+max(e,f); //调用函数max
return(result);
}
main()
{
int final;
serial_initial();
final=add(7,5,2,8);
printf(“%d”,final);
while(1);
}
二.函数的递归
递归调用是嵌套调用的一个特殊情况。如果在调用一个函数过程中又出现了直接或间接调用该函数本身,则称为函数的递归调用。
在函数的递归调用中要避免出现无终止的自身调用,应通过条件控制结束递归调用,使得递归的次数有限。
下面是一个利用递归调用求n!的例子。
【例4-26】递归求数的阶乘n!。
在数学计算中,一个数n的阶乘等于该数本身乘以数n-1的阶乘,即n!=n(n-1)!,用n-1的阶乘来表示n的阶乘就是一种递归表示方法。在程序设计中通过函数递归调用来实现。
程序如下:
#include <reg52.h> //包含特殊功能寄存器库
#include <stdio.h> //包含I/O函数库
extern serial_initial();
int fac(int n) reentrant
{
int result;
if (n==0)
result=1;
else
result=n*fac(n-1);
return(result);
}
main()
{
int fac_result;
serial_initial();
fac_result=fac(11);
printf(“%d\n”,fac_result);
}