在 Zig 语言中,变量和常量的声明方式不同,变量可以修改,而常量在定义后不可变。Zig 强调 强类型安全,不允许 隐式类型转换,这使得代码更加安全和可预测。


目录

  1. 变量 (var)
  2. 常量 (const)
  3. 类型推导
  4. 变量的可变性
  5. 编译时常量 (comptime)
  6. 变量作用域
  7. 参考资料

1. 变量 (var)

在 Zig 中,使用 var 关键字声明变量。变量的值可以被修改,但类型是静态的,不能更改。

示例

var age: i32 = 25; // 声明一个变量
age = 30; // 变量可以修改

⚠️ 注意:变量在未初始化时不能使用,必须先赋值。

var count: i32;
// std.debug.print("Count: {}\n", .{count}); // ❌ 错误,未初始化
count = 10; // ✅ 赋值后才能使用


2. 常量 (const)

使用 const 关键字声明的变量是不可变的,类似于 C/C++ 中的 const。Zig 语言推荐尽量使用 const,以提高代码安全性。

示例

const pi: f64 = 3.1415926535;

尝试修改 const 的值(会报错)

const x: i32 = 10;
x = 20; // ❌ 错误:常量不能被修改


3. 类型推导

Zig 允许 省略类型,编译器会根据赋值自动推导变量类型。

示例

const name = "Zig";  // 类型推导为 `[]const u8`
var score = 100;     // 类型推导为 `i32`

等价于:

const name: []const u8 = "Zig";
var score: i32 = 100;

但在某些情况下,明确指定类型可以提高代码的可读性和可维护性。


4. 变量的可变性

在 Zig 中,变量的可变性是 静态的,也就是说:

  • var 声明的变量可以改变值
  • const 声明的变量不能改变值

示例

var count = 10; // ✅ 可变
count = 20;     // ✅ 允许修改

const max_count = 100; // ❌ 不能修改
// max_count = 200;   // 错误

⚠️ 注意:Zig 变量的类型一旦定义,就不能更改,即使是 var 变量。

var num: i32 = 42;
// num = 3.14; // ❌ 错误:不能将 `f64` 赋值给 `i32`


5. 编译时常量 (comptime)

Zig 允许使用 comptime 关键字,使变量在编译时计算,提高运行时效率。

示例

const std = @import("std");

fn square(comptime x: i32) i32 {
    return x * x;
}

pub fn main() void {
    const result = square(5); // 在编译时计算
    std.debug.print("Square: {}\n", .{result});
}

⚠️ 注意

  • comptime 变量必须在编译时确定其值,不能在运行时更改。

6. 变量作用域

Zig 变量的作用域和 C 语言类似:

  • 全局变量:定义在 main() 之外的变量。
  • 局部变量:定义在函数内部的变量,仅在该函数内可用。

示例

const global_var: i32 = 100; // 全局常量

pub fn main() void {
    var local_var: i32 = 50; // 局部变量
    std.debug.print("Global: {}, Local: {}\n", .{ global_var, local_var });
}

⚠️ 全局变量必须是 const,否则 Zig 不允许。


7. 参考资料


总结

关键字说明
var可变变量,类型固定,但值可变
const常量,类型和值都不可变
comptime编译时常量,提高运行时性能

在 Zig 语言中,推荐优先使用 const,只有在确实需要修改变量时才使用 var,这样可以避免意外的错误,提高代码的可读性和安全性。 🚀