- •Лекция 2.: Типы данных и операции
- •Содержание
- •Порядковые типы данных
- •Стандартные подпрограммы, обрабатывающие порядковые типы данных
- •Типы данных, относящиеся к порядковым
- •Вещественные типы данных
- •Конструируемые типы данных
- •Операции и выражения Арифметические операции
- •Стандартные арифметические функции
- •Арифметические выражения
- •Полнота вычислений
- •Порядок вычислений
- •Другие операции
- •Совместимость типов данных
- •Эквивалентность
- •Совместимость
- •Совместимость по присваиванию
- •Приведение типов данных Неявное приведение типов данных
- •Явное приведение типов данных
- •Функции, изменяющие тип данных
Другие операции
Помимо арифметических, существуют и другие операции, специфичные для значений некоторых стандартных типов данных языка Pascal. Эти операции мы рассмотрим в соответствующих разделах:
#, in, +, *, [] : см. лекцию 5
@, ^ : см. лекцию 10
Стандартные арифметические функции
К арифметическим операциям примыкают и стандартные арифметические функции. Их список с кратким описанием мы приводим в таблице.
Описание Тип аргумента Тип результата1)
abs(x) Абсолютное значение (модуль) числа Арифметический Совпадает с типом аргумента
arctan(x) Арктангенс (в радианах) Арифметический Вещественный
cos(x) Косинус (в радианах) Арифметический Вещественный
exp(x) Экспонента (ex) Арифметический Вещественный
frac(x) Взятие дробной части числа Арифметический Вещественный
int(x) Взятие целой части числа Арифметический Вещественный
ln(x) Натуральный логарифм (по основанию e) Арифметический Вещественный
odd(x) Проверка нечетности числа Целый boolean
pi Значение числа - Вещественный
round(x) Округление к ближайшему целому Арифметический Целый
trunc(x) Округление "вниз" - к ближайшему меньшему целому Арифметический Целый
sin(x) Синус (в радианах) Арифметический Вещественный
sqr(x) Возведение в квадрат Арифметический Вещественный
sqrt(x) Извлечение квадратного корня Арифметический Вещественный
Арифметические выражения
Все арифметические операции можно сочетать друг с другом - конечно, с учетом допустимых для их операндов типов данных.
В роли операндов любой операции могут выступать переменные, константы, вызовы функций или выражения, построенные на основе других операций. Все вместе и называется выражением. Определение выражения через выражение не должно вас смущать, ведь рекурсивное задание конструкций вообще свойственно программированию (см. лекцию 9).
Примеры арифметических выражений:
(x<0) and (y>0) - выражение, результат которого принадлежит к типу boolean;
z shl abs(k) - вторым операндом является вызов стандартной функции;
(x mod k) + min(a,b) + trunc(z) - сочетание арифметических операций и вызовов функций;
odd(round(x/abs(x))) - "многоэтажное" выражение.
Полнота вычислений
В общем случае вычисление сложного логического выражения прекращается в тот момент, когда его окончательное значение становится понятным (например, true or (b<0)). Зачастую такой подход позволяет заметно сэкономить на выполнении "лишних" действий. Скажем, если есть некоторая сложно вычислимая функция my_func, вызов которой входит в состав выражения
if (x<=0) and my_func(z+12),
то для случая, когда x положительно, этих сложных вычислений можно избежать.
Однако включение директивы {$B+} принудит компилятор завершить эти вычисления даже в таком случае. Ее выключение {$B-} вернет обычную схему вычислений.
Порядок вычислений
Если в выражении расставлены скобки, то вычисления производятся в порядке, известном всем еще с начальной школы: чем меньше глубина вложенности скобок, тем позже вычисляется заключенная в них операция. Если же скобок нет, то сначала вычисляются значения операций с более высоким приоритетом, затем - с менее высоким. Несколько подряд идущих операций одного приоритета вычисляются в последовательности "слева направо".
Таблица 2.1. Приоритеты (для всех) операций языка Pascal Операции Приоритет
Унарные2) операции +, -, not, @, ^, # Первый(высший)
Операции, эквивалентные умножению *, /, div, mod, and, shl, shr Второй
Операции, эквивалентные сложению +,-, 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 ленному типу данных).
