15.4 Арифметические операторы

Вверх  Предыдущий  Следующий

Арифметические операторы по сути бинарный оператор. Возможные операции:

умножение
чтобы умножить два аргумента нестандартного типа, оператор умножения (*) должен быть перегружен.

деление
для того, чтобы разделить два аргумента нестандартного типа, оператор деления (/) должен быть перегружен.

сложение
чтобы сложить два аргумента нестандартного типа, оператор сложения (+) должен быть перегружен.

вычитание
чтобы вычесть аргумент нестандартного типа из др. аргумента, оператор вычитания (-) должны быть перегружен.

возведение в степень (exponentiation)
Для возведения аргумента в степень другого аргумента нестандартного типа, оператор возведения в степень (**) должен быть перегружен.

унарный минус
используется, чтобы взять отрицательное значение аргумента следующий за ним (это оператор одного аргумента).

симметричная разность
Для вычисления симметрической разности 2 структур, оператор (><) должен быть перегружен.

Арифметический оператор принимает два параметра, за исключением унарного минуса, для который требуется только один параметр. Первый параметр должен иметь тип, который соответствует аргументу в левой части (до) оператора, второй параметр должен быть того типа, который находится справа (после) от арифметического оператора. Тип результата, должен соответствовать типу результаты арифметической операции.

Для компиляции следующего кода

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), т.е. операция не может быть одинаковой во всех случаях.