3.3 函数

本篇学习函数定义、声明、参数、返回值和函数原型,并能把重复逻辑拆成清晰可复用的函数。

函数

概念说明

函数用于封装一段可以重复调用的逻辑。 把程序拆成多个职责明确的小函数,能让代码更容易阅读、测试和维护。

从执行模型上看,函数调用并不是“跳过去执行一下”这么简单。 每次调用都会形成一层新的调用上下文,用来保存参数、局部变量和返回位置,这也是后面理解递归和调试调用栈的基础。

C 语言里函数通常包含返回类型、函数名、参数列表和函数体。 如果函数定义写在调用之后,通常需要先写函数声明,也叫函数原型。

语法/规则

  1. 函数定义的基本形式是 返回类型 函数名(参数列表) { ... }
  2. 函数声明只写签名,不写函数体,例如 int max(int a, int b);
  3. 函数参数默认采用值传递,函数内部修改形参不会直接改掉调用方实参。
  4. 返回值类型应和 return 表达式保持一致,避免隐式转换掩盖问题。
  5. 函数原型最关键的信息是返回类型和参数类型,它让编译器知道该如何检查调用是否合法。
  6. 同一职责的代码尽量收敛到一个函数里,避免把一段逻辑复制粘贴到多个位置。
  7. 对外复用的函数声明更适合放在头文件中,具体实现放在 .c 文件中。

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

int sum_range(int begin, int end);

int main(void) {
    int result = sum_range(1, 5);
    printf("result = %d\n", result);
    return 0;
}

int sum_range(int begin, int end) {
    int sum = 0;

    for (int i = begin; i <= end; i++) {
        sum += i;
    }

    return sum;
}

输出结果:

1
result = 15

这个例子同时展示了三件事:函数声明、函数调用,以及把实现写在 main 之后时为什么还需要原型。

常见错误

  1. 函数在调用前没有声明,结果依赖旧式规则或直接触发编译错误。
  2. 返回类型和实际返回值不匹配,例如声明 int 却试图返回字符串。
  3. 以为修改函数形参就能直接改掉调用方变量,忽略了值传递的本质。
  4. 函数职责过大,既做输入输出又做计算又做状态修改,后面会很难测试和复用。
  5. 只在一个源文件里写了声明,却忘了把真正实现的源文件加入编译或链接命令。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字