6.1.3 函数的定义
在C51程序中使用函数时,与使用变量一样,要先定义才能使用。定义函数要相对复杂一些。一个完整的函数包括类型说明、参数定义、函数体说明3部分。函数定义的一般形式如下。
类型说明符函数名(形参列表)
形参类型说明
{
语句
return语句
}
❑“类型说明符”声明了自定义函数返回值的类型,该返回值可以是任何有效数据类型。如果是无参函数,即没有返回值,则可以采用“void”无值型变量说明符。如果没有给出类型说明符,则默认函数返回值为整型。对函数类型的说明必须位于首次调用该函数之前,这样编译程序时才能使返回非整型值的函数产生正确的结果。
❑“形参列表”是一个用逗号分隔的参数变量表,其形式为“形参1,形参2……”。当该函数被调用时,其参数自动接收调用主函数中实参的值。无参函数的形参列表是空的,但括号仍然是不可省略的。
❑“形参类型说明”声明了函数内部参数的数据类型。其数据类型可以为C51语言支持的任何数据类型。为了意义表达更为明确,“形参类型说明”也可以放在“形参列表”中,其形式为“数据类型形参1,数据类型形参2……”。
❑“语句”用于自定义函数完成特定的功能。与主函数中的程序语句形式相同。
❑“return语句”用于返回自定义函数执行的结果,如果没有返回值,则可以省略该语句。
说明在程序中使用自定义函数时,才需要进行上述的函数定义。在程序中使用库函数时,不需要再定义,只要将该库函数的头文件“*.h”用include命令包含在源文件前部,即可在程序中直接调用该库函数。
函数定义的程序示例如下。
include<stdio.h>//头文件
int max(x1,x2)//自定义函数,用于求两个整数中的最大值
int x1,x2;//形参类型说明
{
if(x1>x2)//if判断语句
return x1;//如果x1大于x2,则函数返回x1
else
return x2;//如果x1小于x2,则函数返回x2
}
void main()//主函数
{
int x1=17,x2=9;//定义并初始化变量
printf(“x1=%d,x2=%d”,x1,x2);//输出x1、x2的值
printf(“max(x1,x2)=%d\n”,max(x1,x2));//调用函数并输出结果
}
该程序可以在KeilµVision3编译环境中执行,运行的结果如下。
x1=17,x2=9
max(x1,x2)=17
在本例中,首先定义max函数是一个整型函数,形参x1和x2的类型均为整型量。函数返回值是整型数。在函数体中是max函数语句部分,使用if语句将两形参值作比较,将较大值作为函数的返回值,返回给主调函数。在主函数main中调用max函数,将主函数中的实参变量的值x1=17,x2=9传递给形参变量x1和x2,比较并输出结果。
在程序中定义函数时,应注意以下几点。
❑在定义函数时,可将形参类型说明放入形参列表中一并说明。如上例中定义的max函数,采用此法则max函数定义形式如下。
int max(int x1,int x2)//自定义函数,用于求两个整数中的最大值
{
if(x1>x2)//if判断语句
return x1;//如果x1大于x2,则函数返回x1
else
return x2;//如果x1小于x2,则函数返回x2
}
使用这种方法,可以增强函数的可读性,含义表达更明确,避免一些参数变量声明上的错误。
❑在C51程序中,一个函数的定义可以放在任意位置,既可放在主函数main之前,也可放在主函数之后。如果放在主函数之后,需要在主函数执行之前对该函数进行声明。示例如下。
01:#include<stdio.h>//头文件
02:
03:int max(int x1,int x2)//自定义函数声明
04:
05:void main()//主函数
06:{
07:int x1=17,x2=9;//定义并初始化变量
08:printf(“x1=%d,x2=%d”,x1,x2);//输出x1、x2的值
09:printf(“max(x1,x2)=%d\n”,max(x1,x2));//调用函数并输出结果
10:}
11:
12:int max(int x1,int x2)//自定义函数,用于求两个整数中的最大值
13:{
14:if(x1>x2)//if判断语句
15:return x1;//如果x1大于x2,则函数返回x1
16:else
17:return x2;//如果x1小于x2,则函数返回x2
18:}
该程序可以在KeilµVision3编译环境中执行,运行的结果如下。
x1=17,x2=9
max(x1,x2)=17
本例中,在主函数前对自定义的max函数进行了声明,因为max函数放在主函数后进行定义。程序执行效果相同。
注意在上例程序中第3行进行函数声明时,函数后面必须要有一个分号作结尾,否则编译器会以为接下来的代码是定义函数体。