Ziglings 笔记 03: 变量、常量与基本类型
告别隐式转换
在修复了 Hello World 和标准库引入后,Ziglings 的第三个挑战直接切入编程的核心:如何存储数据。
这个练习展示了 Zig 与 C 语言的一个巨大不同:对类型的严格控制。
挑战:类型不匹配
原始代码试图把所有东西都定义为 const u8。这导致了三个问题:
- 试图修改一个
const定义的值。 - 试图在一个只能存 0-255 的
u8中存入314159。 - 试图在一个无符号类型(Unsigned)中存入负数。
解决方案
这是修复后的代码,展示了 Zig 类型的灵活性:
const std = @import("std");
pub fn main() void {
// 1. 必须用 var,因为后面进行了加法赋值
var n: u8 = 50;
n = n + 5;
// 2. u8 放不下 314159,需要扩大到 u32
const pi: u32 = 314159;
// 3. 负数需要有符号整数 (i8)
const negative_eleven: i8 = -11;
std.debug.print("{} {} {}\n", .{ n, pi, negative_eleven });
}
核心知识点总结
1. const 优于 var
在 Zig 中,const 是不可变的,var 是可变的。
最佳实践:默认始终使用 const,只有当编译器报错说你需要修改它时,才将其改为 var。这能大大减少程序中的状态错误。
2. 所见即所得的类型名
Zig 的类型名称非常直观,由“符号性”+“位数”组成:
- u8: Unsigned 8-bit (0 到 255)
- i8: Signed 8-bit (-128 到 127)
- u32: Unsigned 32-bit
- i64: Signed 64-bit
这种命名方式消除了 C 语言中 int, long, long long 在不同平台上大小不一致的歧义。
3. 格式化打印占位符 {}
在 std.debug.print 中,{} 是一个通用的占位符,它可以自动推断并打印出任何基本数据类型的值,非常方便。
后续预告:掌握了基础变量后,我们将面临 Zig 中最令人兴奋(也最让新手困惑)的概念之一:数组与切片。