
5.3. Выражения
Выражение – формула для вычисления некоторого значения, состоящая из операндов, знаков операций и круглых скобок.
Операндами могут быть константы, переменные и вызовы функций.
Приоритет операций
В порядке убывания приоритета операции в Delphi делятся на четыре группы:
операции Not, @ (взятие адреса объекта), – (изменение знака, унарный минус)
операции группы умножения:
*, /, Div, Mod, And, Shl, Shr
операции группы сложения
+, –, Or, Xor
операции группы сравнения
In, =, <>, >, >=, <, <=
Общие правила написания и вычисления выражений
Ниже даны общие правила написания и вычисления выражений:
Первая группа операций имеет самый высокий приоритет, т.е. операции данной группы выполняются в первую очередь.
В каждой из групп операции имеют одинаковый приоритет.
Операции одного приоритета обычно вычисляются в порядке их следования в выражении (слева направо). Иногда для оптимизации вычислений транслятор может переупорядочить их.
Операнд, находящийся между двумя операциями с различными приоритетами, связывается с операцией, имеющей более высокий приоритет.
Операнд, находящийся между двумя операциями с равными приоритетами, связывается с той операцией, которая находится слева от него.
Для уточнения последовательности действий применяются круглые скобки. Действия в скобках выполняются в первую очередь.
Последовательная запись знаков двух операций разрешена.
Например, можно писать:
X* –Y.
X*Not Y.
Многоэтажные формулы в выражении записываются в одну строку.
Знак умножения * опускать нельзя.
Типы выражений
В Delphi каждое выражение определяет значение какого-то определенного типа, поэтому в нем могут фигурировать операнды тоже определенных типов. Над каждым типом значений определен свой набор операций.
Поэтому в Delphi выражения также делятся на несколько типов.
Здесь мы рассмотрим выражения скалярных стандартных типов.
Выражение называется скалярным, если его операндами являются скалярные величины. В результате вычисления скалярного выражения получается одно значение элемента данных.
Скалярные стандартные выражения делятся на три типа:
— арифметические;
— логические;
— символьные.
Тип выражения определяется типом результата его вычисления.
Арифметическое выражение – это выражение, результатом вычисления которого является целое или вещественное значение. Операнды арифметического выражения должны иметь арифметический (целый или вещественный) тип. В качестве операций могут использоваться арифметические операции, определенные для этих типов операндов.
Следует обратить внимание, что в Delphi не определена операция возведения числа Х в степень Y. Для ее реализации можно воспользоваться следующими рассуждениями.
Вспомним, что
Отсюда
Следует однако помнить, что
вычисление
с помощью вышеприведенного выражения
может приводить к существенным
погрешностям. Поэтому, если Y
имеет целочисленный тип, то
лучше
вычислять путем умножения Х
само на себя Y
раз (например, в цикле).
Символьное выражение – это выражение, результатом вычисления которого является символьный тип данных (т.е. отдельные символы).
В Delphi отсутствуют операции, результатом выполнения которых являются данные символьного типа. Поэтому символьным выражением может быть только символьная константа, символьная переменная или функция, дающая результат символьного типа.
Примеры символьных выражений.
‘A’ – символьная константа.
X – символьная переменная.
Pred (X) (X – переменная типа Char).
Chr (I) (I – переменная типа Integer).
Логическое выражение – это выражение, результатом которого является логическое значение (True или False). Операнды логического выражения должны иметь логический тип (операндами могут быть переменные, константы, имена функций). Кроме того, для логических выражений существует специфический вид операнда – отношение.
В РБНФ отношение записывается так:
<Отношение> ::= <Выражение> <Операция_сравнения> <Выражение>.
В качестве выражений могут быть использованы выражения любого из упорядоченных типов и арифметические выражения. Оба выражения должны быть совместимых типов. Результат вычисления отношения имеет логический тип. Таким образом, в логическом выражении могут быть использованы все виды операций и все типы скалярных операндов.
Если отношение является не самостоятельным выражением, а одним из операндов логической операции, то оно должно быть заключено в круглые скобки (т.к. операции сравнения имеют наименьший приоритет).
Пример 5.7.
Примеры логических выражений.
2) ODD(X) – встроенная функция; возвращает значение True, если Х – нечетное, False – если Х четное (Х имеет целочисленный тип).
В данном выражении отношение является операндом логической операции, поэтому заключено в скобки. A, Z могут быть значениями арифметического или любого перечислимого типа, так как они являются операндами отношения. Результат вычисления отношения дает логический тип. Все остальные операнды не являются операндами отношения, а являются операндами непосредственно логического выражения. Поэтому они могут иметь только логический тип.
Модели выполнения операций Or и And
В Delphi поддерживается две модели выполнения операций Or и And – полное вычисление и вычисление по короткой схеме (частичное вычисление).
При полном вычислении вычисляется каждый операнд логического выражения, даже если результат всего выражения уже известен.
Вычисление по короткой схеме осуществляется слева направо (с учетом приоритетов) и прекращается, как только становится очевидным результат всего выражения. Это уменьшает время вычислений и зачастую необходимо.
Схема вычисления задается с помощью опции компилятора {$B}. По умолчанию опция выключена {$B–} – вычисления выполняются по короткой схеме. Для полной схемы вычислений необходимо установить {$B+}.
Опция компилятора {$B} эквивалентна пункту меню среды Delphi «Project / Options / Compiler / Complete boolean eval».
Пример 5.8.
Пусть дано выражение:
(I <= Length(S)) and (S[I] <> ’a’)
В данном выражении S – это строка (переменная типа String), S[I] – I-ый элемент строки (символ), Length – встроенная функция, вычисляющая текущую длину строки. При вычислении по полной схеме такая запись выражения является некорректной, т.к. при значении первого отношения, равном False, значение второго отношения не определено. При вычислении по короткой схеме вычисление выражения прекращается, как только первое отношение равно False (второе отношение вычисляться не будет).
И последнее. Если при записи длинных выражений вы не уверены, в какой последовательности будут выполняться операции, используйте круглые скобки, даже если с учетом приоритета операций они не нужны.