Ziglings 笔记 09: 拒绝模棱两可的 If


严格的守门人

在 Ziglings 的第九个练习中,我正式进入了控制流(Control Flow)的学习。

如果你习惯了 C 语言或动态语言(如 JS/Python),你可能会觉得 if 语句非常宽松。你可以把数字、指针甚至对象直接扔进 if 里。但在 Zig 中,这种“方便”被认为是潜在错误的温床。

挑战:类型不匹配

代码中有一个整数 foo = 42,原始代码试图直接判断它:

// 错误示例
if (foo) { ... }

在 Zig 中,这会导致编译错误:expected type 'bool', found 'comptime_int'。Zig 不会自作聪明地把非零值当作 true

解决方案

你需要明确地告诉编译器你要比较什么:

const std = @import("std");

pub fn main() void {
    const foo = 42;

    // 正确:显式比较,结果是 bool 类型
    if (foo == 42) {
        std.debug.print("Foo is 42!\n", .{});
    } else {
        std.debug.print("Foo is not 42!\n", .{});
    }
}

核心知识点总结

1. 没有“Truthy/Falsy”

Zig 没有“真值”或“假值”的概念。if 条件必须严格计算为 bool 类型(truefalse)。 这意味着你不能写 if (ptr) 来检查指针是否非空,也不写 if (count) 来检查数量是否大于 0。你必须写得清清楚楚:if (ptr != null)if (count > 0)

2. 显式优于隐式

虽然这多敲了几个字符,但它极大地增加了代码的可读性。阅读代码的人不需要猜测 if (foo) 到底是在检查 foo 是否存在、是否为正数、还是是否成功。

3. 标准的比较运算符

Zig 使用标准的 C 系列比较运算符:==, !=, <, >, <=, >=


后续预告:既然 if 这么严格,那如果我们想根据条件给变量赋值该怎么办?下一篇我们将看到 if 在 Zig 中其实是一个表达式(Expression),这让它变得非常强大。