Ziglings 笔记 05: 数组的魔法操作
数组的加法与乘法
在 Ziglings 的第五个练习中,我发现 Zig 对数组的操作不仅方便,而且暗藏玄机。
通常在 C 语言中,想要拼接两个数组是一件麻烦事(需要 malloc,然后 memcpy)。但在 Zig 中,这被简化成了类似数学运算的操作。
挑战:拼接与重复
任务很简单:
- 将两个数组拼接在一起。
- 将一个特定的位模式重复 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 强大的字符串处理能力。