Базовые типы данных и операции над ними, страница 13

4.  В круглые скобки можно записывать выражения, которые в свою очередь, тоже содержат круглые скобки, т.е. допускаются вложенные конструкции круглых скобок.

5.  Остальные группы операторов в порядке убывания приоритета расположены следующим образом:

a)  Арифметические,

b)  Конкатенация строк,

c)  Сравнения,

d)  Логические и

e)  Присваивание.

6.  Унарные операторы, такие как унарный минус «-» и отрицание Not, обладают высшим приоритетом, каждый в своей группе.

7.  Операторы, обладающие одним уровнем приоритета, например «*» и «/», «+» и «-», а также все операторы сравнения, в выражении оцениваются слева направо в порядке их следования.

8.  Наименьшим приоритетом, естественно, обладает оператор присваивания «=», поскольку значение переменной можно присваивать только поле оценки всего выражения справа.

Тип выражения формируется исходя из типов его операндов и выполняемых над ними операций. Обычно в выражениях должны использоваться операнды только одного типа. Если же в выражении используются операнды разных типов, то VBA не всегда считает такое выражение ошибочным, как, например, Pascal, а пытается преобразовать его операнды к некоторому общему, совместимому, типу. С одной стороны такое автоматическое преобразование типов очень удобно, а иногда даже полезно, но с другой стороны оно может быть источником труднообнаруживаемых ошибок. Смешивание в одном выражении разных типов данных – это почти всегда следствие ошибки или непродуманности программы. Кроме того, результаты таких выражений подчас бывает непредсказуемыми.

При смешивании в одном выражении несовместимых типов данных, например, 3 + " банана", VBA прекращает выполнение программы, и выдает сообщении о недопустимом смешении данных. К сообщениям подобного рода не стоит относиться как чему-то негативному – наоборот, от них может быть больше пользы, чем вреда. В приведенном выше выражении, возможно, программист просто забыл заключить в кавычки цифру 3, и правильное выражение должно было бы выглядеть следующим образом – "3" + " банана". Хотя в данном, конкретном случае, необходимо было бы более чётко сформулировать свои намерения – выполнить конкатенацию строк – и вместо символа «+» использовать символ «&» – 3 & " банана". В этом случае VBA смог бы правильно интерпретировать выражение и выполнить автоматическое преобразование числового литерала 3 в данные типа String – что и требовалось согласно контексту.

 Автоматические преобразования типов данных, для обеспечения их совместимости в выражениях VBA, выполняются по-разному, в зависимости от операторов и типов операндов. Формальные правила таких преобразований можно сформулировать следующим образом:

1.  Операнд любого типа всегда можно преобразовать к типу String. Например, результатом выражение "Сегодня " & #4/20/2002# будет следующая строка "Сегодня 20/04/2002". В то время как "Сегодня " + #4/20/2002# – недопустимое выражение – нельзя складывать строку с датой.

2.  Операнд типа String может быть преобразован к другому типу данных, только если его значение, построено по правилам записи литерала соответствующего типа. Например, в результате оценки выражения "-1.1e-1" – 1 будет получено значение -1.11 типа Double.

3.  При выполнении арифметических операторов над числовыми типами данных действуют такие правила:

a)  Если оба операнда одного типа – результат будет того же типа. Например, результатом выражения 2 + 3 будет значение 5 типа Integer, поскольку оба операнда имеют тип Integer.

b)  Если операнды имеют разный тип, то будет выполнено так называемое повышение типа – т.е. тип операнда с меньшим диапазоном значений будет приведен к типу операнда с большим диапазоном значений, и результат тоже будет иметь тип с большим диапазоном значений. Например, выражение 2 + 3! даст результат типа Single, так как первый операнд имеет тип Integer, второй – Single, а всё выражение, соответственно, тоже Single. Иногда, если значение результата операции превышает допустимый диапазон значений большего из операндов, он может быть преобразован к типу с ещё большим диапазоном, вместо выдачи сообщения о переполнении, особенно, если результат присваивается переменной типа Variant. Числовые типы данных в порядке увеличения диапазона значений в VBA расположены следующим образом: Byte, Integer, Long, Single, Double и Currency.

c)  При выполнении операции деления возвращается результат как значение с плавающей точкой типа Single или Double.

d)  При выполнении операции возведения в степень результат всегда Double.

4.  При сложении значений типа Data , а также при выполнении операций сложения и вычитания с одним из числовых типов результат будет типа Data. Например, значением выражение #4/20/2002# + 1.5 будет #21/04/2002 12:00:00#. Такой результат обусловлен тем, что внутреннее представление типа Data – это вещественное значение, в котором дата хранится в целой части, а время – в дробной.

5.  При вычитании значений типа Data результат получается типа Double. Например, выражение #4/20/2002# - #4/21/2002 12:00:00 PM# даст результат -1.5.

6.  Если в выражении имеются операнды логического типа, то значение True преобразуется в -1, а False – в 0. Например, выражение 2 + True будет иметь значение 1, а 2 * False – 0.

7.  Если в выражении имеется хотя бы один операнд со значением Null, всё выражение тоже будет Null.

8.  Если в выражении встречается значение Empty, то в числовом контексте – это 0, а в текстовом – пустая строка нулевой длины. Никаких ошибок недопустимого смешивания типов при этом не возникает.

9.  При выполнении операции присваивания тип выражения справа от знака «=» всегда приводится к типу переменной слева от него. При этом, если диапазон значений переменной больше диапазона значений выражения, никакой потери информации не происходит, если же наоборот – происходит понижение типа.

Так, при присваивании переменной целого типа значения нецелого типа оно округляется до ближайшего целого значения. Например: