15.5 Операторы сравнения

На верх  Назад  Вперёд

Оператор сравнения может быть перегружен, чтобы сравнить два различных или два одинаковых типа, не являющихся стандартными. Тип результата оператора сравнения всегда будет boolean.

Могут быть перегруженными следущие операторы сравнения:

равно
(=) Чтобы определить, что два аргумента равны.

неравно
(<>) Чтобы определить, что два аргумента различны.

меньше
(<) Чтобы определить, что один аргумент меньше другого.

больше
(>) Чтобы определить, что один аргумент больше другого.

больше или равно
(>=) Чтобы определить, что один аргумент больше или равен другому.

меньше или равно
(<=) Чтобы определить, что один аргумент больше или равен другому.

Если нет отдельного оператора неравно (<>), чтобы оценить на неравенство выражение, компилятор использует оператор равно (=), и логически отрицает результат операции. Обратное не верно: если нет оператора "равно", а оператор "неравно" существует, то компилятор не будет использовать его, чтобы оценить выражение, содержащее оператор равно (=).

В качестве примера, следующий оператор позволяет сравнивать два комплексных числа:

operator = (z1, z2 : complex) b : boolean;

приведенное выше определение позволяет сделать сравнение следующего вида:

Var

C1,C2 : Complex;

 

begin

If C1=C2 then

  Writeln('C1 и C2 равны');

end;

Определение оператора сравнения требует двух параметров, с типами, которые определены при объявлении оператора. Компилятор не применяет коммутативности (не переставляет аргументы): если аргументы двух различных типов, то необходимо определить два оператора сравнения.

В случае комплексных чисел, например, необходимо определить два оператора сравнения: один с аргументом комплексного типа впереди, потом вещественного типа, второй оператор - наоборот (сначала вещественного, потом комплексного типа).

С учетом определения операторов

operator = (z1 : complex; r : real) b : boolean;

operator = (r : real; z1 : complex) b : boolean;

возможны следующие два сравнения:

Var

R,S : Real;

C : Complex;

begin

If (C=R) or (S=C) then

  Writeln ('Ok');

end;

Обратите внимание, что порядок аргументов вещественных и комплексных типов в двух сравнениях, меняется.