Оператор присваивания – это элементарная операция императивной модели вычислений, изменяющая состояние памяти путём установления нового соответствия между идентификатором (переменной, полем структуры, элементом массива) и значением некоторого выражения. Формально, если среда исполнения представлена парой ⟨Γ,σ⟩, где Γ – область видимости (сопоставление имён адресам), а σ – хранилище (сопоставление адресов значениям), то оператор

Отсюда следуют два фундаментальных требования корректности:
Адресуемость слева: левая часть должна обозначать место в памяти (переменная, элемент массива, поле записи), а не вычисляемое значение.
Вычислимость справа: правая часть должна быть детерминированно вычислима в текущем состоянии ⟨Γ,σ⟩.
Простое присваивание
x := E
Устанавливает новое значение переменной x. Если x ранее не инициализирована, операция выполняет инициализирующее присваивание (в некоторых языках и контекстах инициализация – отдельный синтаксический конструкт).
Составное присваивание
x += E ⇔ x := x + E
x -= E ⇔ x := x - E
x *= E ⇔ x := x * E
x /= E ⇔ x := x / E
x %= E ⇔ x := x % E
Эквивалентность справедлива при отсутствии побочных эффектов в оценке x и E. В противном случае порядок вычисления может быть существенен.
Множественное (кортежное) присваивание
(x, y, z) := (E1, E2, E3)
Выполняет все вычисления справа до обновления слева, затем одновременно «перекидывает» значения (важная техника для обмена значениями: (x, y) := (y, x) без временной переменной).
Цепочки присваиваний
a := b := c := 0
Как правило, ассоциативность справа налево: сначала c:=0, затем b:=c, затем a:=b. В учебных решениях для ЕГЭ рекомендуется избегать цепочек ради прозрачности.
Присваивание по адресу/индексу/полю
A[i] := E // элемент массива
R.field := E // поле структуры/записи
*ptr := E // по адресу, если язык поддерживает указатели
Все конструкции требуют существования валидного места записи (границы массива, не-нулевой указатель и т.д.).

Приоритет: оператор присваивания имеет один из самых низких приоритетов; выражение x = a + b * c интерпретируется как x = (a + (b * c)).
Ассоциативность: в большинстве языков – справа налево (a = b = c допустимо, а a = b = c = 0 вычисляется справа).
Порядок вычисления операндов – языково-зависим. Для школьного псевдокода и на ЕГЭ по умолчанию предполагается «сначала вычислить правую часть полностью, затем записать слева». Это правило следует соблюдать и в стиле решений.
Согласование типов: тип E обязан быть совместим с типом L. При необходимости допускается явное преобразование:
x : цел; y : вещ; x := округл( y )
Неявные преобразования (widening/narrowing) потенциально ведут к потере точности. На ЕГЭ такие преобразования желательно обозначать явно в тексте решения (округление, усечение, перевод в целый тип).
Инициализация – первое присваивание в момент объявления; присваивание – любое последующее изменение.
Константы не допускают присваивания после инициализации: попытка изменить приводит к ошибке.
Неизменяемые структуры (иммутабельные) реализуют не разрушающее обновление (создание модифицированной копии), что логически эквивалентно присваиванию ссылки на новую версию.
Побочные эффекты и недетерминизм
Выражения вида A[i] := i + (i := i + 1) недопустимы в учебной практике: они соединяют вычисление с изменением того же операнда в одном выражении и зависимы от порядка вычисления.
Безопасное правило: не модифицируйте переменные в той же строке, где используете их несколько раз в правой части. Разнесите вычисления пошагово.
В заданиях ЕГЭ присваивание применяется:
для пошагового расчёта выражений (перенос формулы в программу);
для подсчёта агрегатов в циклах (счётчик, сумма, максимум/минимум);
для управления состоянием при разветвлениях (обновление лучшего ответа);
в моделировании процессов (эмуляция правил переписывания строк, работы автомата);
при обработке массивов (запись по индексу, обмен элементов, сдвиги).
Ключевое методическое правило: каждое присваивание фиксирует инвариант состояния, который должен быть явно понятен из текста решения.
Одна логическая операция – одно присваивание. Не смешивайте многоступенчатые вычисления в одной строке, если они ухудшают читаемость.
Явные преобразования типов. Любую операцию округления/усечения фиксируйте явно.
Не используйте присваивание внутри условий. Сначала вычислите значение, затем сравнивайте.
Избегайте повторных обращений к «дорогим» выражениям. Сохраните промежуточный результат в переменной и используйте его повторно.
Множественное присваивание – только там, где оно повышает ясность. Например, обмен (x, y) := (y, x).
Границы массивов и корректность индексов – до присваивания. Проверяйте диапазон.
Стабильность инвариантов в цикле. Любое присваивание внутри цикла должно сохранять корректность инварианта (например, «sum содержит сумму обработанных элементов»).
Упражнение 1. Пошаговая эмуляция присваиваний
Условие. Дана программа на псевдокоде:
a := 7
b := 3
c := a*b - (a := a + b) + b
Считать, что в учебном алгоритмическом языке ЕГЭ правая часть вычисляется полностью до изменения левой части в каждом присваивании. Найдите итоговые значения a, b, c.
Решение.
После первых двух строк: a=7, b=3.
В третьей строке присутствует присваивание внутри выражения (a := a + b). Сначала вычислим все
подвыражения справа:
a*b = 7*3 = 21.
(a := a + b) – вычисляет a + b = 10, но само изменение a произойдёт только после вычисления всей правой части c := .... Для подстановки в формулу используем значение 10.
+ b = +3.
Итак, правая часть: 21 - 10 + 3 = 14. Теперь выполняются присваивания изнутри наружу:
Сначала a := a + b делает a = 10.
Затем c := 14.
Итог: a=10, b=3, c=14.
Ответ: a=10, b=3, c=14.
Методический вывод: фиксируйте соглашение о порядке – «сперва считаем правую часть, затем присваиваем слева».
Упражнение 2. Инварианты в цикле и составное присваивание
Условие. Дан массив X[1..N] целых чисел. Напишите фрагмент псевдокода, подсчитывающий сумму положительных элементов и количество отрицательных. Разрешено использовать составные присваивания.
Решение.
sum_pos := 0
neg_cnt := 0
для i от 1 до N
если X[i] > 0 то
sum_pos += X[i] // sum_pos := sum_pos + X[i]
иначе если X[i] < 0 то
neg_cnt += 1 // neg_cnt := neg_cnt + 1
конецесли
конецдля
Инварианты:
Ответ: код выше; корректность опирается на сохранение инвариантов при каждой итерации.
Упражнение 3. Множественное присваивание и обмен значений
Условие. Переставьте значения переменных p, q, r так, чтобы после операции выполнялось p≤q≤r, используя минимальное число присваиваний. Разрешено множественное присваивание.
Решение (понятная и короткая версия).
если p > q то (p, q) := (q, p)
если q > r то (q, r) := (r, q)
если p > q то (p, q) := (q, p)
Обоснование: это классический трёхшаговый алгоритм сортировки тройки сравнением и обменом; множественное присваивание элиминирует временные переменные и делает обмен атомарным.
Ответ: приведённая последовательность; после неё гарантированно p≤q≤r.
Упражнение 4. Типы и присваивание с явным преобразованием
Условие. Даны s – строка, представляющая вещественное число в десятичной записи, и переменные x: вещ, n: цел. Требуется:
Присвоить x значение, равное числу из строки s.
Присвоить n целую часть x по правилу математического округления вниз.
Обосновать, почему неявное присваивание n := x может быть нежелательным.
Решение.
x := вещественное_из(s) // парсинг строки в вещ. число
n := пол(floor(x)) // округление вниз (целая часть)
Пояснение: прямое n := x в языках с неявным приведением типов может усечь дробную часть без явного указания на усечение, что снижает прозрачность и может привести к ошибкам. Явная форма фиксирует намерение автора.
Ответ: использовать явные преобразования вещественное_из и floor.
Упражнение 5. Избежание побочных эффектов
Условие. Рассмотрим фрагмент:
i := 1
A[1] := 5
A[i] := A[i] + (i := i + 1)
Предполагается, что массив индексируется с 1. Определите итоговые значения i, A[1], A[2] при двух соглашениях:
(А) Правую часть полностью вычисляют до любого присваивания.
(Б) Подвыражения вычисляются слева направо, а присваивание i := i + 1 происходит сразу при вычислении подвыражения.
Решение.
Исходно i=1, A[1]=5, A[2] не задан.
Случай (А) (рекомендованная для ЕГЭ модель):
Вычисляем правую часть: A[i] читается как A[1]=5; i := i + 1 даёт временное значение 2, но изменение i произойдёт после вычисления всей правой части; значит A[i] + (…)=5+2=7.
Теперь выполняем присваивания: сначала i:=2, затем A[i]:=7 → это A[2]:=7.
Итог: i=2, A[1]=5, A[2]=7.
Случай (Б) (нежелателен в учебной практике):
Ответ: при обоих допущениях здесь получится i=2, A[1]=5, A[2]=7, но пример демонстрирует, почему нельзя смешивать модификацию и использование одного и того же индекса в одной строке.
Путаница «присваивание vs сравнение». В псевдокоде различайте := (присваивание) и = (сравнение).
Потеря точности при неявных преобразованиях. Всегда фиксируйте floor/ceil/round.
Выход за границы массива при записи. Перед A[i] := … проверяйте диапазон i.
Использование неинициализированных переменных. Любая переменная получает значение до первого чтения.
Цепочки присваиваний, скрывающие порядок. Разворачивайте в пошаговый код.
Побочные эффекты в правой части. Разносите на отдельные строки.
Оператор присваивания – базовый механизм изменения состояния в императивных алгоритмах. Его корректное употребление – это:
точная семантика «сначала вычисли справа, затем запиши слева»,
явная работа с типами,
строгий контроль инвариантов, индексов и порядка вычисления.
Такая дисциплина кода непосредственно повышает результативность на ЕГЭ: решения становятся воспроизводимыми, прозрачными для проверки и устойчивыми к типичным ошибкам.