15.4 Арифметические операторы |
Вверх Предыдущий Следующий |
Арифметические операторы по сути бинарный оператор. Возможные операции: умножение деление сложение вычитание возведение в степень (exponentiation) унарный минус симметричная разность Арифметический оператор принимает два параметра, за исключением унарного минуса, для который требуется только один параметр. Первый параметр должен иметь тип, который соответствует аргументу в левой части (до) оператора, второй параметр должен быть того типа, который находится справа (после) от арифметического оператора. Тип результата, должен соответствовать типу результаты арифметической операции. Для компиляции следующего кода var R : real; C,Z : complex;
begin C:=R*Z; end; Нужно определить оператор умножения так: Operator * (r : real; z1 : complex) z : complex; begin z.re := z1.re * r; z.im := z1.im * r; end; Как можно видеть, первый аргумент оператора имеет тип real, а второй имеет тип complex. Тип результата является complex. Умножение и сложение вещественных и комплексных чисел коммутативные (можно переставлять аргументы) операции. Компилятор, однако, об этом не имеет ни малейшего представления, так что даже если оператор умножения вещественного на комплексное число определен, то компилятор не будет использовать это определение для умножения комплексного числа на вещественное, он использует определённый оператор для аргументов указанных только в таком порядке. Для коммутативности необходимо определить обе операции (оператор с разными комбинациями аргументов). Таким образом, учитывая приведенное выше определение оператора умножения, компилятор не примет следующий порядок следования аргументов: var R : real; C,Z : complex; begin C:=Z*R; end; Поскольку типы Z и R не совпадают с типами в определении оператора. Причина такого поведения заключается в том, что вполне возможно, умножение не всегда коммутативно. Например , умножение матрицы (n, m) на матрицу (m, n) приведет к матрице (n, n), в то время как результат умножение матрицы (m, n) на матрицу (n, m) представляет собой матрица (m, m), т.е. операция не может быть одинаковой во всех случаях. |