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 循环有什么特别之处呢?