Ziglings 笔记 05: 数组的魔法操作


数组的加法与乘法

在 Ziglings 的第五个练习中,我发现 Zig 对数组的操作不仅方便,而且暗藏玄机。

通常在 C 语言中,想要拼接两个数组是一件麻烦事(需要 malloc,然后 memcpy)。但在 Zig 中,这被简化成了类似数学运算的操作。

挑战:拼接与重复

任务很简单:

  1. 将两个数组拼接在一起。
  2. 将一个特定的位模式重复 3 次。

解决方案

这是我的代码实现:

const std = @import("std");

pub fn main() void {
    const le = [_]u8{ 1, 3 };
    const et = [_]u8{ 3, 7 };

    // 1. 使用 '++' 连接数组
    // 结果: 1, 3, 3, 7
    const leet = le ++ et;

    // 2. 使用 '**' 重复数组
    // 结果: 1, 0, 0, 1 重复三次
    const bit_pattern = [_]u8{ 1, 0, 0, 1 } ** 3;

    // 预览:Zig 的 for 循环
    std.debug.print("LEET: ", .{});
    for (leet) |n| {
        std.debug.print("{}", .{n});
    }

    std.debug.print(", Bits: ", .{});
    for (bit_pattern) |n| {
        std.debug.print("{}", .{n});
    }
    std.debug.print("\n", .{});
}

核心知识点总结

1. ++ 连接操作符

这就好比字符串拼接一样,Zig 允许直接用 ++ 将两个固定长度的数组连起来,变成一个新的大数组。

2. ** 重复操作符

这就好比乘法,array ** 3 会把数组的内容复制三份连在一起。

3. 最重要的一点:Comptime(编译期执行)

这两个操作符有一个非常重要的限制:它们只在 编译期 (Compile Time) 生效。 这意味着:

  • 生成的数组长度必须是固定的。
  • 所有的计算是在编译代码时完成的,而不是在程序运行时。
  • 性能优势:因为计算前置了,程序运行时没有任何拼接或循环复制的开销,这体现了 Zig “高性能” 的设计哲学。

后续预告:刚才简单看了一眼 for 循环,接下来的练习应该会深入探讨 Zig 强大的字符串处理能力。