← На главную

Zig потребует скобки при неоднозначном приоритете операторов

02.11.2026 17:22 · hackernews

В master-ветке Zig реализовали предложение #114 о частичном приоритете операторов. Его открыли ещё 8 февраля 2016 года, и на момент закрытия это было вторым по возрасту открытым предложением языка. Реализацию подготовил участник CMDRZero, а Исаак Фройнд помог с изменениями грамматики.

Теперь некоторые сочетания операторов больше не имеют определённого приоритета. Если выражение можно прочитать неоднозначно, компилятор выдаст ошибку и потребует расставить скобки. Например, x orelse y == z без скобок больше не примется: в Zig 0.17.x оно вычислялось как (x orelse y) == z, но такой порядок было трудно уверенно вспомнить. Привычные арифметические выражения вроде x + y * z по-прежнему не требуют дополнительной записи.

Цель нововведения — сократить число правил, которые программисту нужно держать в голове. Для арифметики и логики остаются знакомые уровни: умножение и деление, затем сложение и вычитание, сравнения, а также and и or. При этом смешивание % с умножением, делением или другим % потребует скобок. Запоминать полный список запрещённых сочетаний не нужно: читатель увидит скобки в коде, а автор получит понятную ошибку компилятора.

Разработчики ожидают, что изменение затронет сравнительно небольшую долю программ. В собственной кодовой базе Zig объёмом более миллиона строк пришлось поправить 353 строки. Сложные выражения станут визуально длиннее, зато их порядок вычисления будет виден непосредственно, без обращения к полной таблице приоритетов.

Для обновления старого кода есть два пути. Первый — вручную исправлять каждую ошибку ambiguous operator precedence. Автор записи рекомендует именно его: проверка замысла выражения иногда выявляет уже существующие ошибки. Второй вариант — zig fmt --upgrade, который автоматически добавляет скобки и сохраняет прежний порядок вычислений Zig 0.17.x. Флаг --upgrade планируют убрать после одного цикла релизов.

Даже после автоматического обновления автор советует просмотреть diff. Форматтер сохраняет старое поведение, но оно не всегда совпадает с первоначальным намерением программиста. Кроме того, он может оставить избыточные скобки, которые придётся убрать вручную. Команда надеется, что новое правило уменьшит число ошибок, связанных с неверно запомненным приоритетом.

Читать оригинал →