第七章:函数
级别 1 — 入门
将逻辑封装为可重用、可组合的单元。
函数是组织代码的主要机制。函数接受输入(参数),执行计算,并产生输出(返回值)。C 和 Auto 共享相同的基本模型,但在语法、类型表达和安全保证上有所不同。
7.1 简单函数
C 函数有返回类型、名称、参数列表和函数体:
c
// C
int max(int a, int b) {
if (a > b) {
return a;
} else {
return b;
}
}Auto 函数使用 fn 关键字,类型注解在参数名之后:
auto
// Auto
fn max(a int, b int) int {
if a > b { a } else { b }
}主要区别:
| 特性 | C | Auto |
|---|---|---|
| 关键字 | 无(返回类型在前) | fn |
| 返回类型 | 函数名之前 | 参数列表之后 |
| 参数语法 | int a, int b | a int, b int |
| 返回语句 | return expr; | 最后表达式或 return |
| 空参数 | void | 空 () |
| 缺少返回值 | 未定义行为 | 编译错误 |
隐式返回: 在 Auto 中,块中的最后一个表达式是其值。当函数体是单个表达式或最后一个表达式是预期的返回值时,不需要显式 return 关键字:
auto
fn square(x int) int {
x * x // 隐式返回
}
fn clamp(val int, lo int, hi int) int {
max(lo, min(val, hi)) // 隐式返回
}前向声明: 在 C 中,函数必须在使用前声明。这通常需要在文件顶部写前向声明(原型):
c
int min(int a, int b); // 前向声明
int max(int a, int b) { ... }
int clamp(int v, int lo, int hi) { return max(lo, min(v, hi)); }
int min(int a, int b) { return a < b ? a : b; }Auto 不需要前向声明。编译器在单次遍历中解析函数引用,所以你可以在定义之前调用函数:
auto
fn clamp(val int, lo int, hi int) int {
max(lo, min(val, hi))
}
fn max(a int, b int) int {
if a > b { a } else { b }
}
fn min(a int, b int) int {
if a < b { a } else { b }
}