函数

加入嵌入式技术QQ群:398294860,免费获取嵌入式技术文档,嵌入式最新学习路线指南,更多嵌入式教程,访问宅学部落淘宝店:https://wanglitao.taobao.com/

在上面的章节中,我们定义了一个代码块,用来实现两个数的加法运算:

#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函数将它打印出来。

专门为嵌入式设计的C语言进阶视频教程:《C语言嵌入式Linux高级编程》,一共9期,涉及计算机体系结构、ARM汇编与反汇编、程序的编译链接原理、堆栈内存、Linux内核的面向对象编程思想、多任务编程、C语言的模块化编程等专题,具体课程详情可点击淘宝:C语言嵌入式Linux高级编程