Глава 2 · Переменные и значения
Присваивание
Изменить уже сохранённое значение позволяет присваивание: выражение справа от знака равенства вычисляется, а результат записывается в переменную, элемент массива или поле записи. Тип цели при этом остаётся прежним.
Форма инструкции
<цель> = <выражение>
Слева от знака равенства стоит цель, которая допускает запись: имя переменной, элемент массива или поле записи, например count, items[1], point.X. Выражение справа даёт новое значение, совместимое с типом цели; допустимые преобразования перечислены в статье о преобразованиях типов.
Инструкция допустима на верхнем уровне программы, в подпрограммах и блоках, но нового имени она не вводит: переменная должна быть объявлена заранее, а её имя — доступно в текущей области видимости.
Вычисление до записи
Правая часть вычисляется прежде, чем результат попадёт в цель, поэтому в ней можно использовать прежнее значение той же переменной:
DIM total AS INTEGER = 4
total = total + 3
PRINT total
Результат:
7
Каждое следующее присваивание опирается на результат предыдущего: здесь счётчик сначала увеличивается на единицу, а затем полученное значение удваивается:
DIM count AS INTEGER = 2
count = count + 1
count = count * 2
PRINT count
6Элементы и поля
Присваивание целого массива записывается с суффиксом [] у обеих массивных переменных: basket[] = fruits[]. Вторая переменная получает независимую копию, включая вложенные изменяемые данные. Явная функция ARRAYCLONE(fruits[]) также создаёт независимую копию. Если справа стоит вызов функции с массивным результатом, достаточно самого вызова: basket[] = MakeFruits().
Запись в отдельный элемент массива требует индекса после имени, запись в поле — имени поля после точки:
TYPE Position
X AS INTEGER
END TYPE
DIM point AS Position
DIM items[1 TO 2] AS INTEGER
items[1] = 8
point.X = items[1] + 1
PRINT items[1], point.X
Результат:
8 9
Элемент массива принимает значение только при выделенных элементах и индексе в допустимых границах; подробности обращения к элементам и полям приведены в статьях об индексировании массивов и о полях TYPE. Присваивание массива целиком или записи подчиняется правилам копирования и совместного использования памяти, описанным в статьях о массивных представлениях и о пользовательских типах.
Ограничения и другие значения знака равенства
Не всякая цель допускает запись: константа и переменная только для чтения не могут стоять слева от знака равенства. Значения FILE также не присваиваются общей инструкцией — для открытия и закрытия файла предусмотрены OPEN и CLOSE.
Вне инструкции тот же знак = обозначает сравнение. Поэтому PRINT total = 7 выводит TRUE или FALSE и оставляет total без изменения. Запись <поле> := <значение> задаёт значение именованного поля в литерале записи; как инструкция присваивания она не используется.
Диагностика
MB2001: цель или выражение обращается к необъявленному либо недоступному имени.MB2003: значение несовместимо с типом цели либо выполняется прямое присваивание FILE.MB2010: цель является константой или доступна только для чтения.MB3005: элементы массива ещё не выделены.MB3002: индекс выходит за границы массива.
Ошибки вычисления правой части описаны в статьях соответствующих операций и функций.
Кортежи
Связанные значения разных типов можно хранить в кортеже, объявлять с полным или общим типом группы, передавать функции и распаковывать. Все формы и примеры приведены на странице кортежей.