Ziglings 笔记 03: 变量、常量与基本类型


告别隐式转换

在修复了 Hello World 和标准库引入后,Ziglings 的第三个挑战直接切入编程的核心:如何存储数据

这个练习展示了 Zig 与 C 语言的一个巨大不同:对类型的严格控制

挑战:类型不匹配

原始代码试图把所有东西都定义为 const u8。这导致了三个问题:

  1. 试图修改一个 const 定义的值。
  2. 试图在一个只能存 0-255 的 u8 中存入 314159
  3. 试图在一个无符号类型(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 中最令人兴奋(也最让新手困惑)的概念之一:数组与切片。