Глава 2 · Переменные и значения
Оператор CONST
Предельное количество, коэффициент расчёта или неизменный заголовок удобно назвать один раз и дальше ссылаться на это имя в выражениях. CONST сохраняет результат выражения под таким именем и запрещает его переписывать.
Форма объявления
CONST <имя> AS <тип> = <выражение>
После CONST указываются имя константы, её тип после AS и начальное выражение после знака равенства. Тип и выражение обязательны, а результат выражения должен быть совместим с указанным типом. Одна инструкция объявляет одну константу, поэтому несколько констант записываются отдельными строками.
CONST допустим на верхнем уровне файла, в подпрограмме и внутри блока. Имя действует в соответствующей области видимости и участвует в выражениях наравне с именами переменных.
CONST LIMIT AS INTEGER = 10
DIM count AS INTEGER = 7
PRINT count <= LIMIT
Результат:
TRUEВычисление начального значения
Когда выполнение достигает CONST, вычисляется начальное выражение, в котором допустимы обращения к переменным и вызовы функций. Полученное значение сохраняется за константой, даже если использованные при вычислении данные затем изменятся:
DIM source AS INTEGER = 5
CONST SNAPSHOT AS INTEGER = source + 1
source = 99
PRINT SNAPSHOT
Результат:
6
Повторное выполнение CONST заново вычисляет начальное выражение, поэтому в теле цикла константа получает значение при каждом проходе.
Некоторым объявлениям значение нужно ещё при компиляции — так обстоит дело с границами фиксированного массивного поля TYPE. В этих местах допустимы целочисленные константные выражения, которые компилятор вычисляет заранее; пригодность константы для такого объявления определяется её начальным выражением.
Защита от изменения
Прямое присваивание константе запрещено, как и передача её параметру BYREF, который допускает изменение переданного значения; в обоих случаях выдаётся MB2010. Ограничения распространяются и на предопределённые константы.
Данные, которые должна изменять подпрограмма, объявляются обычной переменной через DIM. Правила передачи аргументов приведены в статье «Вызовы и аргументы». Форма STRING * N в CONST не поддерживается.
Массивное значение константы
CONST <имя>[] AS <тип элемента> = <массивное выражение>
CONST <имя>[,] AS <тип элемента> = <двумерное массивное выражение>
Для массива квадратные скобки находятся после имени: пустая пара задаёт ранг 1, запятые — большее число измерений. Тип элемента и начальное выражение обязательны, ранг и тип элементов должны совпадать. Границы в таком объявлении не задаются: они приходят из начального массива. Обращение к константе целиком также требует []; индекс выбирает элемент. Суффикс массива после типа в именованном объявлении CONST запрещён с MB2003.
CONST fruits[] AS STRING = SPLIT("яблоко,банан", ",")
PRINT fruits[2]
PRINT ARRAYLENGTH(fruits[])
Результат:
банан
2
CONST защищает имя от записи и передачи BYREF. Обычное присваивание массива из константы создаёт независимую копию по общим правилам; изменение копии не меняет константу. Явная функция ARRAYCLONE также копирует данные.
Предопределённые имена
Три имени уже доступны без объявления:
| Имя | Значение и назначение | Тип |
|---|---|---|
| PI | Число π | DOUBLE |
| ROW | 1, первое измерение массива | INTEGER |
| COLUMN | 2, второе измерение массива | INTEGER |
В аргументах, задающих номер измерения массива, вместо чисел 1 и 2 можно указывать ROW и COLUMN. Переобъявить PI, ROW или COLUMN через DIM либо CONST, а также дать эти имена процедурам SUB и функциям FUNCTION верхнего уровня нельзя.
Константа модуля
PUBLIC CONST <имя> AS <тип> = <выражение>
PRIVATE CONST <имя> AS <тип> = <выражение>
PUBLIC и PRIVATE допустимы только перед объявлением верхнего уровня файла. С PUBLIC константа доступна файлам, которые явно импортируют этот модуль; с PRIVATE или без модификатора доступ ограничен текущим файлом. Импортируемая константа также защищена от присваивания и передачи BYREF. Правила доступности и импорта приведены в статьях PUBLIC и PRIVATE и IMPORT.
Диагностика
MB2010: присваивание константе или передача константы параметру BYREF.MB2002: повторное объявление имени, включая PI, ROW или COLUMN.MB2016: объявление перекрывает доступную внешнюю переменную или константу.MB2003: начальное значение несовместимо с типом константы.MB2018: числовая константа не помещается в указанный тип.MB2026: в CONST использована форма STRING * N.