Переменная – это именованный программный объект, ассоциированный с областью памяти и типом (явным или неявным), предназначенный для хранения значения, которое может изменяться в ходе выполнения алгоритма. Понимание природы переменной опирается на триединство: имя → объект (ячея памяти) → значение. Для ЕГЭ по информатике это фундамент: переменные присутствуют в каждом задании с вычислениями, счётчиками, аккумуляторами, строками, массивами, а ошибки трактовки области видимости, типа или инициализации – типичные источники неверных ответов.
Переменная как тройка
Удобно рассматривать переменную как тройку:
⟨идентификатор, тип, класс хранения⟩
Идентификатор – имя (лексема), по которому переменная используется в коде.
Тип – множество допустимых значений и определённые над ними операции.
Класс хранения – способ выделения/времени жизни: автоматический (стек), статический/глобальный, динамический (куча), захват в замыкание и т. п.
Уровни связывания имени
Связывание имени с сущностью происходит поэтапно:
синтаксический разбор → проверка имён/типов → размещение (линковка/загрузка) → исполнение
В статически типизированных языках тип фиксируется до исполнения; в динамически типизированных – имя в момент выполнения ссылается на объект определённого типа.
Базовые типы
Целые (знаковые/беззнаковые), вещественные (с плавающей точкой), логические, символьные, строковые, ссылочные/указатели, составные (массивы, записи/структуры, кортежи).
Ключевое: тип определяет допустимые операции (например, целочисленное деление, конкатенацию строк) и правила преобразований.
Диапазоны для целых n-бит (двоичное дополнение до двух)
min_signed = -2^(n-1)
max_signed = 2^(n-1) - 1
max_unsigned = 2^n - 1
Эти формулы удобно держать под рукой на ЕГЭ при оценке переполнений и предельных значений.
Область видимости (scope)
Лексическая область видимости – множество точек программы, где имя доступно. Иерархия блоков определяет скрытие (shadowing): внутренний идентификатор перекрывает внешний.
Время жизни (lifetime)
Автоматическое (стековое) – от входа в блок/функцию до выхода.
Статическое – на всём протяжении программы.
Динамическое – управляется разработчиком (выделение/освобождение) или сборщиком мусора.
Закрытая переменная (в замыкании) – живёт дольше кадра функции, которая её создала.
Место хранения
Стек активаций (локальные), статическая область (глобальные/статические), куча (динамические объекты).
Оценка расхода стека в рекурсии:
stack_usage = frame_size * recursion_depth
где frame_size – суммарный объём локалов и служебных данных кадра вызова.

Инициализация и первый доступ
Правило: чтение до инициализации – ошибка. В статических языках это диагностируется компилятором/анализатором, в динамических – приводит к исключениям или логическим сбоям.
Присваивание
Присваивание связывает объект-приёмник и значение-источник:
x := выражение
При этом выполняются: вычисление выражения → приведение типов (если нужно) → запись в память.
Неизменяемость (const, final, immutable)
Неизменяемые переменные и объекты упрощают доказательства корректности и предотвращают случайные модификации. На ЕГЭ это уменьшает количество состояний для анализа.
Передача по значению/по ссылке
По значению: функция получает копию (изменения не влияют на аргумент).
По ссылке/указателю: функция может менять исходный объект.
Алиасинг (совпадение ссылок)
Две переменные могут ссылаться на один и тот же объект (в динамически типизированных и ссылочных семантиках). Это влияет на результат мутаций:
a = [1,2]; b = a # b и a указывают на один список
b.append(3) # в a тоже появится 3
На ЕГЭ это часто проверяется в задачах на списки/массивы и копирование.
Классические роли переменных и их инварианты:
Инвариант: после обработки i элементов k = i.
Инвариант: s_i = sum_{t=1..i}(a_t).
Чёткая фиксация инварианта облегчает доказательство корректности и оценку количества итераций – важная часть решений на ЕГЭ.
Целочисленное vs вещественное деление
целочисленное: 7 div 2 = 3
вещественное: 7 / 2 = 3.5
остаток: 7 mod 2 = 1
Ошибки выбора операции (div vs /) – частая причина неправильных ответов.
Переполнение и потеря точности
Переполнение целого:
if x > max_signed then переполнение
if x < min_signed then переполнение
Ошибки округления у вещественных: числа хранятся в формате IEEE 754, не все десятичные дроби представимы точно (например, 0.1). Для сравнения с допуском используйте:
abs(a - b) <= eps
В экзаменационных заданиях требуется:
Упражнение 1. Инициализация и инвариант счётчика
Дан фрагмент псевдокода:
sum := 0
k := ? // отсутствует явная инициализация
for i := 1 to n do
if a[i] > 0 then
sum := sum + a[i]
k := k + 1
print(sum, k)
а) Укажите корректную инициализацию k и сформулируйте инвариант после t итераций.
б) Оцените итоговые значения sum и k, если во входе все элементы ≤ 0.
в) Объясните, к чему приведёт отсутствие инициализации k в языках C/C++ и Python.
Упражнение 2. Тип деления и тип переменных
Пусть s – сумма n целых, требуется вывести среднее. Сравните:
avg1 := s / n // вещественное деление
avg2 := s div n // целочисленное деление
а) Для каких значений s, n результаты совпадают?
б) Какой тип нужно выбрать для avg1 и avg2?
в) Приведите пример входа, где выбор неверной операции даёт неправильный ответ.
Упражнение 3. Алиасинг и копирование
Даны два фрагмента (язык со списками по ссылке):
a := [1,2]; b := a; b.append(3)
и
a := [1,2]; b := copy(a); b.append(3)
а) Опишите содержимое a и b после каждого фрагмента.
б) Сформулируйте правило, когда нужно делать «глубокую копию» вместо поверхностной.
в) Приведите задачу ЕГЭ, где неверное копирование приводит к неправильному ответу.
Упражнение 4. Переполнение целого
Пусть используется 32-битный знаковый тип. Оцените корректность:
fact := 1
for i := 2 to n do
fact := fact * i
а) Найдите максимальное n, при котором fact точно представимо.
б) Предложите варианты обхода: большой тип, длинная арифметика, логарифмический подсчёт.
в) Объясните, как заранее проверить потенциальное переполнение по формуле:
if fact > max_signed / i then переполнение при умножении
Упражнение 5. Инвариант и флаг «найдено»
Найти, встречается ли в массиве элемент, равный x:
found := false
i := 1
while i ≤ n and not found do
if a[i] = x then
found := true
else
i := i + 1
print(found)
а) Сформулируйте инвариант: «если найдено = false после t шагов, то среди a[1..i-1] нет x».
б) Докажите корректность выхода цикла.
в) Оцените сложность в худшем и среднем случаях.
Переменная – не просто «коробка для числа», а формальная сущность с именем, типом, временем жизни и местом хранения. Грамотное использование переменных требует дисциплины: правильной инициализации, выбора типа, фиксации инвариантов, контроля переполнений и точности. Освоив изложенные правила и отработав упражнения, вы укрепите навыки алгоритмического мышления и снизите риск типовых ошибок – именно то, что необходимо для уверенного выполнения задач ЕГЭ по информатике.