Найти тему
Стив Май

Переменные в ЯП (для ЕГЭ)

Сразу на берегу спойлер: тема переменных в языках программирования очень широкая, в её рамках написано столько статей и томов, что можно закопаться целиком. Я всё это немного систематизировал, и приведу здесь только самые базовые вещи, которых хватит на экзамене ЕГЭ и ОГЭ. Это не статья для узких специалистов, это статья для будущих специалистов, для учеников школ, которые хотят разобраться.

Я напишу очень просто и коротко о том, как действовать школьнику, который хочет разобраться с этими переменными. Если потребуется, то потом напишу ещё одну (или не одну) более подробную статью о переменных.

Сначала немного теории

Переменная и память машины

Переменная, она - величина. У величины есть

  1. Название
  2. Обозначение
  3. Единицы измерения
  4. Методика измерения
  5. Значение

Переменным (изменяемым) может быть только значение.

Технически, для машины у переменной остаётся только обозначение и значение, а всё остальное выкидывается. Память машины, условно говоря, разбита на мелкие ячейки (биты), которые сгруппированы по 8 (в байты). Все биты обязательно заполнены либо "нулями" либо "единицами", и мы можем их перезаписать. Чтобы это сделать, надо знать либо адрес этих ячеек, либо их обозначение. Обозначение по-хорошему называется "имя". Примерно так:

В переменной с именем "a" записано число 23
В переменной с именем "a" записано число 23

В общем-то ничем не отличается от записи чисел в обычной тетрадке, но есть пара тонкостей.

Тонкость 1. Целое неотрицательное число записывается привычным образом в двоичной системе, при этом недостающие слева цифры - нули - писать всё-таки обязательно. А для записи отрицательных и дробных чисел используется чуть более сложная схема.

Тонкость 2. Количество ячеек (бит), которые оставлены для записи нашего числа, ограничено и изменению не подлежит. Если выделено 16 ячеек, то самое большое число, которое можно записать туда, будет состоять из 16 единиц (это 65535). Отсюда вытекает очень интересная особенность: когда мы попытаемся записать туда число больше, чем влазит, то старшие биты просто выкинутся. Например, если взять переменную из 8 бит и попытаться впихнуть в неё число 300, то:

Запись числа 300 в ячейку из 8 бит
Запись числа 300 в ячейку из 8 бит

покрашенная красным "единица" просто выкинется, и останется число 44. Ошибки машина не выкинет, ибо это не баг, а фича.

Тонкость 3. Если мы ничего не записали в переменную, то мы не знаем, что в ней. Задача:

Буратино дали три яблока, потом ещё два яблока. Сколько яблок стало у Буратино?

Ответ "5"? Неправильно! Потому что мы не знаем, сколько яблок было у него изначально. С переменными то же самое: изначально непонятно, что в них записано. Скорее всего, это остатки от данных других программ, которые пользовались этой памятью до нашей. В ЕГЭ справедливо считается ошибкой использовать значение переменной до того, как в эту переменную записано что-то. Ремарка: процесс первой записи числа в переменную называется инициализацией, и некоторые ЯП автоматически инициализируют переменные при их описании, занося туда значение, соответствующее нулю.

Работа с переменными

Чтобы понять, как работает машина с переменными, надо проделать это вручную. Для конкретики я возьму синтаксис языка Паскаль.

С переменной машина может делать всего две вещи: записать туда значение и считать оттуда значение, при чём при считывании запись сохранится. При ручной работе это может выглядеть как запись в тетрадку: обведите несколько клеточек в тетради ручкой, припишите к прямоугольничку название:

"Создание" переменной на бумаге. В этом прямоугольнике можно писать не в двоичной форме
"Создание" переменной на бумаге. В этом прямоугольнике можно писать не в двоичной форме

Теперь можно карандашом туда записывать что пожелаем. В Паскале (и во всех прочих ЯП) есть оператор присваивания ( := ). Это специальная команда машине записать что-то в память. Например, если в тексте программы есть

a := 74;

то мы должны записать в прямоугольник с именем "a" число "74":

a := 74;
a := 74;

Если надо записать новое число, то машине надо снова дать эту же команду. А на бумаге стереть число в прямоугольнике и записать новое.

Если у нас есть пять переменных, то нужно рисовать пять прямоугольников. Если у нас есть массив, то с одним именем у нас будет много прямоугольников:

Представление массива на бумаге
Представление массива на бумаге

Номера прямоугольникам присвоены для того, чтобы их различать (имя-то у них одно).

И последнее. Про оператор присваивания. Он работает следующим образом: вычисляет всё, что стоит справа от него, а потом результат записывает в переменную, имя которой стоит слева от него. Например, если у нас в переменной записано число 74, а справа от присваивания записаны действия, то сначала выполнится сложение с тем, что записано в переменной.

-6

Читать стоит так:

  1. Возьми число из переменной
  2. Сложи это число и 7
  3. Запиши результат вместо старого числа в переменную

(Часто вызывает недоумение запись "x = 7 + x", характерная, например, для Бэйсика. Попытка решить это "уравнение" не приводит к успеху, потому что это - не уравнение, а руководство к действию по пп. 1-3 выше)

PS.

Всё вышеописанное очень трудно наблюдать в "простых" языках типа Python, который сейчас очень модный для изучения в школах. Всё из-за того, что такие языки имеют динамическую типизацию - размер переменной и метод записи меняется (переменная в более широком смысле) в зависимости от того, что мы пытаемся запихнуть в эту переменную. Поэтому, кстати, я всегда рекомендую начинать изучение программирования не с "простых", а с классических языков - Си, Си++, Бэйсик и Паскаль.