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 时间!这次的测验可能会结合函数和控制流。