Переменные: 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-константой.
Проверьте себя
1. Что произойдёт с неинициализированной переменной в Zig?
AПолучит нулевое значение
BПолучит мусор как в C
CКомпилятор потребует инициализацию или явное undefined
DПрограмма упадёт в рантайме
2. Что делать с локальной переменной, которую вы объявили, но не используете?
AНичего, это просто предупреждение
BЭто ошибка компиляции — нужно использовать или отбросить через _
CZig её автоматически удалит
DДобавить комментарий