函数简介


到目前为止都只使用一个函数(Function),也就是main()主函数,,若某些代码经常使用,可以抽出成为新函数以便重复调用,函数用来将程序组织为一个小的、独立的运行单元,一个函数可以接受数据,并运行其中的算法,最后将结果返回。

函数的组成主要包括四个部份:返回值、函数名称、参数列与函数主体。前三者称为函数定义或函数原型(Function prototype),C 语言规定,如果函数是在main之后实现,必须在main之前进行定义,否则会出现编译错误。

函数原型定义了函数的外观,通常定义在独立的标头文件,而被含入每个想调用函数的文件中,以下是一个函数定义的范例:

math.h

int power2(int);
int power(int, int);

在 C 中如果调用函数不返回任何值,则定义为void,若不传入任何实参,则参数列保持空白即可,也可以使用void来加以注明,标头文件被存储为 .h 文件,接着可以根据函数原型来实现函数主体,例如,在 math.c 中编写:

math.c

#include "math.h"

int power2(int num) {
    return power(num, 2);
}

int power(int n, int p) {
    int r = 1;
    for(int i = 0; i < p; i++) {
        r *= n;
    }

    return r;
}

在含括标头文件时,若标头文件与含入标头文件的文件在同一个目录下,那么就使用双引号""来包括标头文件名称,如果是标准或项目专属的标头文件,例如 C 的标准标头文件,那么则使用大括号<>来括住,编译器在寻找时就会从设定的目录中开始寻找。

接着可以在含入标头文件后,直接调用所定义的函数,例如在 main.c 中编写:

main.c

#include <stdio.h>
#include "math.h"

int main(void) {
    int num = 0;
    int p = 0;

    printf("输入数值:");
    scanf("%d", &num);

    printf("输入平方:");
    scanf("%d", &p);

    printf("%d 平方:%d\n", num, power2(num));
    printf("%d 的 %d 次方 %d\n", num, p, power(num, p));

    return 0;
}

可以使用gcc math.c main.c来编译,执行结果如下:

输入数值:10
输入平方:3
10 平方:100
10 的 3 次方:1000

在编译时期,编译器会检查被调用的函数,若无法根据函数名称、提供的实参类型与函数定义上参数类型来决定被调用的函数,会出现编译错误,这就是必须先作函数定义的原因,这对编译器的检查工作是必要的数据。


展开阅读全文