Arithmetic operators define the action of a binary operator. Possible operations are:
The definition of an arithmetic operator takes two parameters. The first parameter must be of the type that occurs at the left of the operator, the second parameter must be of the type that is at the right of the arithmetic operator. The result type must match the type that results after the arithmetic operation.
To compile an expression as
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; |
Multiplication and addition of reals and complexes are commutative operations. The compiler, however, has no notion of this fact so even if a multiplication between a real and a complex is defined, the compiler will not use that definition when it encounters a complex and a real (in that order). It is necessary to define both operations.
So, given the above definition of the multiplication, the compiler will not accept the following statement:
var R : real; C,Z : complex; begin C:=Z*R; end; |
The reason for this behaviour is that it is possible that a multiplication is not always commutative. e.g. the multiplication of a (n,m) with a (m,n) matrix will result in a (n,n) matrix, while the mutiplication of a (m,n) with a (n,m) matrix is a (m,m) matrix, which needn’t be the same in all cases.