Ziglings 笔记 10: 消失的三元运算符


既是判断,也是赋值

在 Ziglings 的第十个练习中,我学到了一个有趣的语法特性:If 表达式

如果你来自 C、C++ 或 JavaScript 背景,你一定很熟悉三元运算符(Ternary Operator):

// C 语言风格
int price = discount ? 17 : 20;

这种写法非常紧凑。但在 Zig 中,我发现找不到 ? : 这个符号。

挑战:根据条件设定价格

任务要求根据 discount 布尔值来决定 price 是 17 还是 20。

解决方案

Zig 选择复用 if 关键字来完成这项工作:

const std = @import("std");

pub fn main() void {
    const discount = true;

    // Zig 的 if 语句可以作为表达式使用
    // 这直接替代了其他语言中的 condition ? a : b
    const price: u8 = if (discount) 17 else 20;

    std.debug.print("With the discount, the price is ${}.\n", .{price});
}

核心知识点总结

1. 表达式 vs 语句

在很多语言中,if 只是控制流语句。但在 Zig(以及 Rust、Ruby 等现代语言)中,if 是一个表达式,这意味着它会返回一个值

2. 设计哲学:少即是多

Zig 故意移除三元运算符,是为了减少语言的冗余。 既然 if 已经表达了“如果…否则…”的逻辑,为什么还需要一套特殊的符号 ? : 呢?这种设计让语言更加一致,减少了新手的记忆负担。

3. 类型安全

当你像这样使用 if 时,Zig 编译器会强制检查两个分支返回的类型是否兼容。如果 if 返回数字而 else 返回字符串,编译将无法通过。


后续预告:掌握了基本的流程控制后,接下来的练习我们将进入循环的世界。Zig 的 while 循环有什么特别之处呢?