2. 函数声明

函数声明 是告诉编译器遇到的标识符的类型是什么。函数要先声明后使用。

我们先来看如下的一段代码,我们将函数的 myadd 的定义放到了 main 函数的下面,编译时就会报告警告。

// filename: function_declaration.c
#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("1 + 5 = %d\n", myadd(1, 5));

    return 0;
}

int myadd(int x, int y) {
    return x + y;
}

编辑信息如下:

weimingze@mzstudio:~$ gcc -o function_declaration function_declaration.c
function_declaration.c: In function ‘main’:
function_declaration.c:4:28: warning: implicit declaration of function ‘myadd’ [-Wimplicit-function-declaration]
    4 |     printf("1 + 5 = %d\n", myadd(1, 5));
      |                            ^~~~~

上述是 GCC 编译器给出的警告,原因是程序编译和我们阅读文章的顺序是一样的,程序编译时是自上而下,每一行自左向右进行分析和编译。当程序读取到标识符 myadd 时,程序不知道 myadd 是变量还是函数。因此就会给出警告或错误来提示程序编写者修改代码来解决上述问题。

上面的问题我们只需要在程序读取到 myadd 之前告诉编译器 myadd 是什么就可以了。那我们需要使用函数声明来告诉编译器 myadd 是含有两个整数形式参数和一个整数返回值的函数。下面我们来看一下函数声明的语法。

函数声明的语法

返回值的类型 函数名(数据类型1 [变量名1], 数据类型2 [变量名2], ...);

说明:

示例

修改上述程序,加入函数声明如下

#include <stdio.h>

// 声明 myadd 是函数,也可以写成 : int myadd(int, int);
int myadd(int x, int y);

int main(int argc, char *argv[]) {
    printf("1 + 5 = %d\n", myadd(1, 5));

    return 0;
}

int myadd(int x, int y) {
    return x + y;
}

编译和运行结果如下:

weimingze@mzstudio:~$ gcc -o function_declaration function_declaration.c
weimingze@mzstudio:~$ ./function_declaration
1 + 5 = 6

练习:

编写一个判断一个整数是否是素数的函数 is_prime。其功能是判断传入的参数是否是素数,如果传入的参数是素数则返回 1,否则返回 0

素数(Prime number)也叫质数,是只能被 1 和自身整数的整数,如:2357111317、...

要求函数的定义格式如下:

int is_prime(int x) {
    ...
}

算法描述:

  1. 如果 x 小于 2 则一定不是素数。
  2. 如果 x 大于等于 2,则循环使用 2x-1 的整数 y 求余数,即 x % y 只要有一个余数为零,则说明 x 不是素数。如果余数都不为零, 说明 x 是素数。

其实还用更高效的方法请各位朋友自己去网上搜索并实现。