函数
概念说明
函数用于封装一段可以重复调用的逻辑。 把程序拆成多个职责明确的小函数,能让代码更容易阅读、测试和维护。
从执行模型上看,函数调用并不是“跳过去执行一下”这么简单。 每次调用都会形成一层新的调用上下文,用来保存参数、局部变量和返回位置,这也是后面理解递归和调试调用栈的基础。
C 语言里函数通常包含返回类型、函数名、参数列表和函数体。 如果函数定义写在调用之后,通常需要先写函数声明,也叫函数原型。
语法/规则
- 函数定义的基本形式是
返回类型 函数名(参数列表) { ... }。 - 函数声明只写签名,不写函数体,例如
int max(int a, int b);。 - 函数参数默认采用值传递,函数内部修改形参不会直接改掉调用方实参。
- 返回值类型应和
return表达式保持一致,避免隐式转换掩盖问题。 - 函数原型最关键的信息是返回类型和参数类型,它让编译器知道该如何检查调用是否合法。
- 同一职责的代码尽量收敛到一个函数里,避免把一段逻辑复制粘贴到多个位置。
- 对外复用的函数声明更适合放在头文件中,具体实现放在
.c文件中。
示例
| |
输出结果:
| |
这个例子同时展示了三件事:函数声明、函数调用,以及把实现写在 main 之后时为什么还需要原型。
常见错误
- 函数在调用前没有声明,结果依赖旧式规则或直接触发编译错误。
- 返回类型和实际返回值不匹配,例如声明
int却试图返回字符串。 - 以为修改函数形参就能直接改掉调用方变量,忽略了值传递的本质。
- 函数职责过大,既做输入输出又做计算又做状态修改,后面会很难测试和复用。
- 只在一个源文件里写了声明,却忘了把真正实现的源文件加入编译或链接命令。