第十五章、函数

函数(Function)是实现了某一功能的代码块。函数可以一次定义,多次使用。

前面我们学习使用过很多的函数,如:printfscanfstrlen等。这些函数实现了输出、输入、求字符串长度功能。那这些函数从哪来的呢?我们自己能否写类似的函数呢?这一章我们来学习自己编写和使用函数。

函数是面向过程编程的重要组成部分。在编写大型软件的时候,我们通常以函数为单位来编写程序,用多个函数的相互调用来组合出复杂的软件功能。

函数 对应的英文的单词是 Function,个人感觉理解为功能更有利于学习。

使用函数机制的优点:

  1. 使程序变得简短而清晰。
  2. 有利于程序的维护。
  3. 可以提高程序的开发效率。
  4. 可以提高代码的重用性。
  5. 有利于错误调试。

下面我们来学习函数的语法。

1. 函数定义和调用

在使用函数时,需要了解几个知识点:函数定义函数调用函数声明函数的传参等。我们先来说一下函数的定义。

函数定义 是将一段代码块组合打包,成为一个整体。方便以后使用。

函数定义的语法

返回值的数据类型 函数名(数据类型1 形参变量1, 数据类型2 形参变量2, ...) {
    语句
}

说明:

  1. 返回值的类型表示函数的返回值(函数的输出)的类型,如果函数没有返回值,可以定义为 void 类型。
  2. 函数名必须是标识符
  3. 函数名是一个常量,不要对其赋值。
  4. 括号内的 数据类型1 形参变量1, 数据类型2 形参变量2, ... 被称为形式参数列表,它是一系列形参变量的声明列表,表示函数的输入。
  5. 语句部分是函数的主体,此部分如同复合语句,它的内部可以有变量声明和语句部分。
  6. 函数名的值是语句部分的代码块编译后的指令序列的起始地址。

示例

写一个函数 myadd,函数有两个整数输入 ,返回两个数的和。

int myadd(int x, int y) {
    int r; // 声明一个变量,用来保存临时结果。
    r = x + y;
    return r;
}

上述程序我们定义了一个名为 myadd 的函数,此函数的括号内()有两个变量声明 int x, int y,这个变量用来接收存入进来的数据(实际调用传递参数)。最前面的 int 是函数调用时调用表达式的返回类型。函数的大括号{}内是函数的主体部分。其中的 return r; 结束函数的执行,并将 r 的值返回给调用表达式。

下面我们再来看一下上述函数如何使用。

函数的调用

函数定义只是定义编码函数体编译一段代码

函数调用的语法

函数名(表达式1, 表达式2, ...)

说明:

  1. 函数名必须是已经定义的函数。
  2. 表达式1, 表达式2, ... 被称为实际调用传递参数列表(也称为实参列表)。
  3. 实参列表的表达式的个数(实参个数)由函数的定义决定。调用时不能随意改写实参个数。
  4. 实参列表内的表达式需要计算完毕后才一次性的传递给被调用函数的形式参数变量,然后再执行函数体内的语句块。

示例:

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

// 定义一个函数myadd事项两个整数相加并返回结果。
int myadd(int x, int y) {
    int r; // 声明一个变量,用来保存临时结果。
    r = x + y;
    return r;
}

int main(int argc, char *argv[]) {
    int a;
    int b;
    int result;

    printf("请输入第一个数:");
    scanf("%d", &a);
    printf("请输入第二个数:");
    scanf("%d", &b);

    // 第一次调用 myadd 函数,实参 a 赋值给形参变量 x, 实参 b 赋值给形参变量 y。
    result = myadd(a, b);  // 将myadd 函数调用结果保存在 result 变量中
    printf("result:%d\n", result);

    // 第二次调用,传入两个整数字面值常量并赋值给 x 和 y。
    result = myadd(1, 5);
    printf("result:%d\n", result);

    return 0;
}

执行结果如下:

weimingze@mzstudio:~$ gcc -o function_def function_def.c
weimingze@mzstudio:~$ ./function_def
请输入第一个数:10
请输入第二个数:20
result:30
result:6

练习:

#include <stdio.h>

int mymax(int a, int b) {
    // ... 完成此函数内的代码。
}

int main(int argc, char *argv[]) {

    printf("100 和 200 的最大值是: %d\n", mymax(100, 200));
    printf("9 和 1 的最大值是: %d\n", mymax(9, 1));

    return 0;
}