Если в выражении расставлены скобки, то вычисления производятся в порядке, известном всем еще с начальной школы: чем меньше глубина вложенности скобок, тем позже вычисляется заключенная в них операция. Если же скобок нет, то сначала вычисляются значения операций с более высоким приоритетом, затем - с менее высоким. Несколько подряд идущих операций одного приоритета вычисляются в последовательности "слева направо".
Таблица 2.1. Приоритеты (для всех) операций языка Pascal Операции Приоритет
Унарные2) операции +, -, not, @, ^, # Первый(высший)
Операции, эквивалентные сложению +,-, or, xor Третий
Операции сравнения =, <>, >, <, <=, >=, in Четвертый
Замечание: Вызов любой функции имеет более высокий приоритет, чем все внешние относительно этого вызова операции. Выражения, являющиеся аргументами вызываемой функции, вычисляются в момент вызова (см. лекцию 8).
Примеры выражений (с указанием последовательности вычислений) для целых чисел:
a + b * c / d (результат принадлежит к вещест-
3 1 2 венному типу данных);
a * not b or c * d = 0 (результат принадлежит к логиче-
2 1 4 3 5 скому типу данных);
-min(a + b, 0) * (a + 1) (результат принадлежит к целочис-
3 2 1 5 4 ленному типу данных).
В общем случае при выполнении арифметических (и любых других) операций компилятору требуется, чтобы типы операндов совпадали: нельзя, например, сложить массив и множество, нельзя передать вещественное число функции, ожидающей целый аргумент, и т.п.
В то же время, любая процедура или функция, написанная в расчете на вещественные значения, сможет работать и с целыми числами.
Правила, по которым различные типы данных считаются взаимозаменяемыми, мы приводим ниже.
Эквивалентность - это наиболее высокий уровень соответствия типов. Она требуется при действиях с указателями (см. лекцию 10), а также при вызовах подпрограмм. "А как же тогда быть с оговоркой, сделанной двумя абзацами выше?" - спросите вы. Мы не станем сейчас описывать механизм передачи аргументов процедурам и функциям, поясним лишь, что эквивалентность типов требуется только для параметров-переменных (см. лекцию 8).
Итак, два типа - Т1 и Т2 - будут эквивалентными, если верен хотя бы один вариант из перечисленных ниже:
Т1 и Т2 совпадают;
Т1 и Т2 определены в одном объявлении типа;
Т1 эквивалентен некоторому типу Т3, который эквивалентен типу Т2.
Поясним это на примере:
type T2 = T1;
T3 = T1;
T4,T5 = T2;
Здесь эквивалентными будут Т1 и Т2; Т1 и Т3; Т1 и Т4; Т1 и Т5; Т4 и Т5. А вот Т2 и Т3 - не эквивалентны!