函数
在上面的章节中,我们定义了一个代码块,用来实现两个数的加法运算:
#include <stdio.h>
int main(void)
{
int sum;
int a, b;
for(int i = 0; i < 3; i++)
{
printf("input a b:");
scanf("%d %d", &a, &b);
sum = a + b;
printf("sum = %d\n", sum);
}
return 0;
}
然后通过for循环,不断地重复运行这段代码,来实现多次加法运算。在C语言中,对于一些可以重复利用的代码,我们可以把它封装成一个函数,一个函数实现一个特定的功能,然后可以被其他的函数调用,进而可以实现代码的复用。比如我们在上面程序中使用的printf函数、scanf函数,这2个函数分别实现了打印和输入功能,所有的用户都可以调用它来完成自己程序中的打印和输入功能。
大家可以试想一下,如果没有这两个函数,每个人写程序都自己实现打印和输入功能,每个人都会写一些重复的、相同的代码,这是很没有必要的:浪费时间、浪费人力,直接使用封装好的函数不香么?
我们可以对上面的代码进行改进,将多次重复运行的代码封装成一个函数:
#include <stdio.h>
int add(void)
{
int a, b;
int sum;
printf("input a b:");
scanf("%d %d", &a, &b);
sum = a + b;
printf("sum = %d\n", sum);
return 0;
}
int main(void)
{
for(int i = 0; i < 3; i++)
add();
return 0;
}
我们给for循环体内的代码块,添加一个函数名和返回值,这段代码就变成了一个函数add(),然后在main函数中直接通过函数调用去执行这段代码就可以了,其运行效果跟原先的程序是一样的。
函数的本质其实就是一段可重复使用的代码块,一个函数实现某个特定的功能,然后其他函数可以去调用了,避免了重复造轮子,实现了代码复用。我们在调用一个函数时,可以给这个函数传数据,函数对接收的这些数据进行处理,然后将处理结果通过返回值返回给调用它的函数。一个函数的格式如下:
返回值类型 函数名(函数的参数列表)
{
函数体,用来实现某个特定功能
}
上面的add函数处理的是用户从键盘上输入的数据,而不是main函数传给他的数据,所以函数的参数列表为空。如果我们想通过main函数给它传数据,可以将add函数改成下面的形式:
//main.c
#include <stdio.h>
int add(int a, int b)
{
int result;
result = a + b;
return result;
}
int main(void)
{
int sum;
sum = add(3, 4);
printf("sum = %d\n", sum);
return 0;
}
在上面的程序中,我们重新定义了add函数,该函数有2个参数,用来接收调用者传进来的数据:在main函数中,当我们调用add函数时,将两个加数3和4传给了add,在add函数内,通过对应的参数a和b来接收这两个数据,然后在函数体内对这两个数据进行运算,并将运算结果以函数返回值的形式返还给main函数。
编译并运行上面的程序,程序的运行结果为:
root@ubuntu:/home/code# gcc main.c
root@ubuntu:/home/code# ./a.out
sum = 7
在main函数中,像3和4这两个实际传过去的参数,一般也称为实际参数,简称实参。而在add函数中,参数列表中的a和b一般称为形式参数,简称形参。形参主要用来接收像main函数这样的调用者传进来的实参值,保存起来并对这些数据进行操作。
函数一般也会有返回值,当函数运行运行结束时,会通过return语句,将一个指定的值返回给调用它的函数。在上面的程序中,当add函数运行结束户,会将两个加数的和作为一个返回值返回给main函数,在main函数中定义了一个变量sum用来接收和保存这个返回值,然后通过printf函数将它打印出来。