函数的定义
在C语言中,定义一个函数的具体语法格式如下:
返回值类型 函数名(参数类型 参数名1,参数类型 参数名2,……,参数类型 参数名n)
{
执行语句
………
return 返回值;
}
上述语法格式中,各项的含义具体如下。
● 返回值类型:用于限定函数返回值的数据类型。例如,当函数返回一个int类型的数据时,返回值类型就是int。
● 函数名:表示函数的名称,该名称可以根据标识符命名规范来定义。
● 参数类型:用于限定函数调用时传入函数中的参数数据类型。
● 参数名:函数被调用时,用于接收传入的数据,参数名可以根据标识符命名规范来定义。
● return关键字:用于结束函数,将函数的返回值返回到函数调用处;
● 返回值:被return语句返回的值,该值会返回给函数调用者。
根据上述函数定义格式,下面定义一个函数,用于实现两个int类型数据的求和功能,并将求和结果返回给调用者,示例代码如下:
int add(int a, int b)
{
int sum;
sum = a + b;
return sum;
}
上述代码中,add()函数的返回值类型为int,有两个int类型的参数a与b。在函数体内,首先定义了一个int类型的变量sum,然后将参数a与b相加的结果赋值给sum,最后使用return关键字将sum返回。当有调用者调用add()函数时,传入相应的参数值,就会得到相应的求和结果。在main()函数中调用add()函数,具体如例1所示。
例1 add.c
1 #include <stdio.h>
2 int add(int a, int b)
3 {
4 int sum;
5 sum = a + b;
6 return sum;
7 }
8 int main()
9 {
10 int ret1 = add(1, 3); //调用add()函数,传入数据1、3
11 int ret2 = add(5, 6); //调用add()函数,传入数据5、6
12 int ret3 = add(12, 100); //调用add()函数,传入数据12、100
13 printf("ret1 = %d\n", ret1);
14 printf("ret2 = %d\n", ret2);
15 printf("ret3 = %d\n", ret3);
16 return 0;
17 }
例1运行结果如图1所示。
图1 例1运行结果
在例1中,第2~7行代码定义了add()函数;第10~12行代码调用了三次add()函数,每次传入不同的数据,并将结果分别赋值给变量ret1、ret2、ret3。第13~15行代码调用printf()函数将结果输出。由图1可知,程序输出结果正确无误,表明add()函数成功调用。
函数不能嵌套定义,即不能在一个函数中再定义另外的函数,错误示例代码如下:
int add(int a, int b) //定义add()函数
{
int sum;
sum = a + b;
return sum;
char sub(int x, int y) //在add()函数内部定义sub()函数,错误
{
int sum = x - y;
return sum;
}
}
另外,需要注意的是,函数的“定义”与“声明”并不是一个意思,“定义”是指对函数功能的确立,函数的定义是一个完整的、独立的函数单位。函数的声明则是把函数名、参数列表、返回值类型通知编译系统,以便在调用时系统按照此声明进行对照检查。通俗的说法,函数定义有函数体,函数声明没有函数体。
在C语言中,函数声明有两种形式,具体如下:
返回值类型 函数名(参数类型1 参数名1,参数类型2 参数名2,…参数类型n 参数名n);
返回值类型 函数名(参数类型1,参数类型2,…参数类型n);
上述两种方式都可以声明函数,第一种声明方式,参数列表有参数类型和参数名;第二种声明方式,参数列表中只有参数类型,没有参数名。有些编程人员喜欢用第二种形式,格式精炼;有些人则更愿意用第一种形式,不易出错,并且用有意义的参数名增加了代码的可读性。
例如,声明例1中的add()函数,示例代码如下:
int add(int a,int b);
int add(int, int);