Ziglings 笔记 19: 函数参数与数学运算
传递数据
在学会了定义空参数函数后,Ziglings 的第 19 个练习要求我们编写一个能够接收输入的函数。
这才是函数真正强大的地方——通过参数复用逻辑。
挑战:2 的 N 次方
我们需要实现一个名为 twoToThe 的函数,它接收一个数字作为指数,计算并返回 2 的该次幂。
解决方案
这是补充完整的函数定义:
const std = @import("std");
pub fn main() void {
std.debug.print("Powers of two: {} {} {} {}\n", .{
twoToThe(1),
twoToThe(2),
twoToThe(3),
twoToThe(4),
});
}
// 核心点:
// 1. 参数名必须与函数体内的 'my_number' 一致。
// 2. 参数类型必须是 u32,以匹配 std.math.pow 的要求。
fn twoToThe(my_number: u32) u32 {
// std.math.pow(T, base, exp)
// 计算 base 的 exp 次方,结果类型为 T
return std.math.pow(u32, 2, my_number);
}
核心知识点总结
1. 参数定义语法
Zig 的参数定义非常标准:name: type。
fn add(a: u32, b: u32) u32 { ... }
如果有多个参数,用逗号分隔。
2. 重要特性:参数不可变
值得注意的是,在 Zig 函数内部,参数实际上是常量(Constants)。
你不能在 twoToThe 内部执行 my_number += 1。这与 C 语言不同(C 语言传递的是值的拷贝,可以随意修改)。
这种设计强制了单向数据流,使代码更易于推理。如果需要修改,你必须在函数内部创建一个新的 var 变量来接收它。
3. std.math.pow
这是 Zig 标准库提供的幂运算函数。由于 Zig 不像 Python 那样有 ** 运算符,我们需要调用 std.math 模块。它的第一个参数用于指定运算的数据类型(如 u32, f64 等),体现了 Zig 显式类型的特点。
后续预告:我们已经掌握了基本的函数调用。接下来又到了 Quiz 时间!这次的测验可能会结合函数和控制流。