Переменные: const и var
Учимся объявлять переменные и понимаем, почему Zig требует инициализации.
const — неизменяемая привязка значения, var — изменяемая; в Zig по умолчанию выбирают
const, аvarиспользуют только там, где значение действительно меняется.
В Zig есть всего два слова для объявления значений: const и var. Это резко контрастирует с C, где переменная по умолчанию изменяема, и нужно вручную добавлять const для неизменяемости. Zig поощряет обратную привычку: сначала const, а изменяемость — осознанный выбор.
Базовый синтаксис
const pi = 3.14159; // тип выводится: comptime_float
const answer: i32 = 42; // явный тип i32
var counter: u32 = 0; // изменяемая переменная
counter += 1; // допустимо: counter — var
После двоеточия указывается тип. Если тип не указан, Zig выводит его сам. Обратите внимание: const справа от имени, как и в большинстве деклараций Zig, читается «слева направо»: имя, потом тип, потом значение.
Никаких неинициализированных переменных
В C объявление int x; создаёт переменную с мусорным значением — источник коварных багов. Zig это запрещает: каждая переменная должна быть инициализирована. Если вам действительно нужна неинициализированная память, вы пишете это явно через undefined.
var buffer: [16]u8 = undefined; // явно: содержимое не определено
// читать buffer до записи — логическая ошибка, и это видно в коде
Ключевое слово undefined — это явное согласие на неопределённое значение. В отличие от C, здесь вы не получаете мусор случайно: вы запрашиваете его осознанно, и читатель кода это видит.
Неиспользуемые переменные — ошибка
Zig считает неиспользуемую локальную переменную ошибкой компиляции, а не предупреждением. Это отлавливает опечатки и забытый код. Если переменная нужна только ради побочного эффекта, её отбрасывают через _:
const result = compute();
_ = result; // явно говорим: значение нам не нужно
Как работает под капотом
const в Zig — это не просто пометка «только для чтения». Если значение известно на этапе компиляции, оно становится comptime-константой и может участвовать в вычислениях во время компиляции. Поэтому const в Zig мощнее, чем const в C: это мостик к метапрограммированию, о котором будет отдельный раздел.
Частые ошибки
Первая ловушка — объявить var, но ни разу не изменить значение: компилятор предложит заменить на const. Вторая — забыть, что неиспользуемые переменные запрещены, и получить ошибку сборки на ровном месте. Третья — попытаться прочитать переменную, помеченную undefined, до записи; это неопределённое поведение, и в режиме отладки Zig заполняет такую память узнаваемым байтом 0xAA, чтобы баг бросался в глаза.
Итог
const— неизменяемая привязка (предпочтительна),var— изменяемая.- Каждая переменная обязана быть инициализирована; мусор запрашивают явно через
undefined. - Неиспользуемые переменные — ошибка компиляции; отбросить значение можно через
_. constс известным значением становится comptime-константой.