Сразу на берегу спойлер: тема переменных в языках программирования очень широкая, в её рамках написано столько статей и томов, что можно закопаться целиком. Я всё это немного систематизировал, и приведу здесь только самые базовые вещи, которых хватит на экзамене ЕГЭ и ОГЭ. Это не статья для узких специалистов, это статья для будущих специалистов, для учеников школ, которые хотят разобраться.
Я напишу очень просто и коротко о том, как действовать школьнику, который хочет разобраться с этими переменными. Если потребуется, то потом напишу ещё одну (или не одну) более подробную статью о переменных.
Сначала немного теории
Переменная и память машины
Переменная, она - величина. У величины есть
- Название
- Обозначение
- Единицы измерения
- Методика измерения
- Значение
Переменным (изменяемым) может быть только значение.
Технически, для машины у переменной остаётся только обозначение и значение, а всё остальное выкидывается. Память машины, условно говоря, разбита на мелкие ячейки (биты), которые сгруппированы по 8 (в байты). Все биты обязательно заполнены либо "нулями" либо "единицами", и мы можем их перезаписать. Чтобы это сделать, надо знать либо адрес этих ячеек, либо их обозначение. Обозначение по-хорошему называется "имя". Примерно так:
В общем-то ничем не отличается от записи чисел в обычной тетрадке, но есть пара тонкостей.
Тонкость 1. Целое неотрицательное число записывается привычным образом в двоичной системе, при этом недостающие слева цифры - нули - писать всё-таки обязательно. А для записи отрицательных и дробных чисел используется чуть более сложная схема.
Тонкость 2. Количество ячеек (бит), которые оставлены для записи нашего числа, ограничено и изменению не подлежит. Если выделено 16 ячеек, то самое большое число, которое можно записать туда, будет состоять из 16 единиц (это 65535). Отсюда вытекает очень интересная особенность: когда мы попытаемся записать туда число больше, чем влазит, то старшие биты просто выкинутся. Например, если взять переменную из 8 бит и попытаться впихнуть в неё число 300, то:
покрашенная красным "единица" просто выкинется, и останется число 44. Ошибки машина не выкинет, ибо это не баг, а фича.
Тонкость 3. Если мы ничего не записали в переменную, то мы не знаем, что в ней. Задача:
Буратино дали три яблока, потом ещё два яблока. Сколько яблок стало у Буратино?
Ответ "5"? Неправильно! Потому что мы не знаем, сколько яблок было у него изначально. С переменными то же самое: изначально непонятно, что в них записано. Скорее всего, это остатки от данных других программ, которые пользовались этой памятью до нашей. В ЕГЭ справедливо считается ошибкой использовать значение переменной до того, как в эту переменную записано что-то. Ремарка: процесс первой записи числа в переменную называется инициализацией, и некоторые ЯП автоматически инициализируют переменные при их описании, занося туда значение, соответствующее нулю.
Работа с переменными
Чтобы понять, как работает машина с переменными, надо проделать это вручную. Для конкретики я возьму синтаксис языка Паскаль.
С переменной машина может делать всего две вещи: записать туда значение и считать оттуда значение, при чём при считывании запись сохранится. При ручной работе это может выглядеть как запись в тетрадку: обведите несколько клеточек в тетради ручкой, припишите к прямоугольничку название:
Теперь можно карандашом туда записывать что пожелаем. В Паскале (и во всех прочих ЯП) есть оператор присваивания ( := ). Это специальная команда машине записать что-то в память. Например, если в тексте программы есть
a := 74;
то мы должны записать в прямоугольник с именем "a" число "74":
Если надо записать новое число, то машине надо снова дать эту же команду. А на бумаге стереть число в прямоугольнике и записать новое.
Если у нас есть пять переменных, то нужно рисовать пять прямоугольников. Если у нас есть массив, то с одним именем у нас будет много прямоугольников:
Номера прямоугольникам присвоены для того, чтобы их различать (имя-то у них одно).
И последнее. Про оператор присваивания. Он работает следующим образом: вычисляет всё, что стоит справа от него, а потом результат записывает в переменную, имя которой стоит слева от него. Например, если у нас в переменной записано число 74, а справа от присваивания записаны действия, то сначала выполнится сложение с тем, что записано в переменной.
Читать стоит так:
- Возьми число из переменной
- Сложи это число и 7
- Запиши результат вместо старого числа в переменную
(Часто вызывает недоумение запись "x = 7 + x", характерная, например, для Бэйсика. Попытка решить это "уравнение" не приводит к успеху, потому что это - не уравнение, а руководство к действию по пп. 1-3 выше)
PS.
Всё вышеописанное очень трудно наблюдать в "простых" языках типа Python, который сейчас очень модный для изучения в школах. Всё из-за того, что такие языки имеют динамическую типизацию - размер переменной и метод записи меняется (переменная в более широком смысле) в зависимости от того, что мы пытаемся запихнуть в эту переменную. Поэтому, кстати, я всегда рекомендую начинать изучение программирования не с "простых", а с классических языков - Си, Си++, Бэйсик и Паскаль.