Expressions

Expressions occur in assignments or in tests. Expressions produce a value of a certain type. Expressions are built with two components: operators and their operands. Usually an operator is binary, i.e. it requires 2 operands. Binary operators occur always between the operands (as in X/Y). Sometimes an operator is unary, i.e. it requires only one argument. A unary operator occurs always before the operand, as in -X.

When using multiple operands in an expression, the precedence rules of table (12.1) are used.

Operator | Precedence | Category |

Not, @, unary +, unary -, ** | Highest (first) | Unary operators, power |

* / div mod and shl shr as << >> | Second | Multiplying operators |

+ - or xor | Third | Adding operators |

= <> < > <= >= in is | Lowest (Last) | relational operators |

When determining the precedence, the compiler uses the following rules:

- In operations with unequal precedences the operands belong to the operator with the highest precedence. For example, in 5*3+7, the multiplication is higher in precedence than the addition, so it is executed first. The result would be 22.
- If parentheses are used in an expression, their contents is evaluated first. Thus, 5*(3+7) would result in 50.

Remark: The order in which expressions of the same precedence are evaluated is not guaranteed to be left-to-right. In general, no assumptions on which expression is evaluated first should be made in such a case. The compiler will decide which expression to evaluate first based on optimization rules. Thus, in the following expression:

a := g(3) + f(2);

f(2) may be executed before g(3). This behaviour is distinctly different from Delphi or Turbo Pascal.

If one expression must be executed before the other, it is necessary to split up the statement using temporary results:

e1 := g(3);

a := e1 + f(2);

a := e1 + f(2);

Remark: The exponentiation operator (**) is available for overloading, but is not defined on any of the standard Pascal types (floats and/or integers).

12.1 Expression syntax

12.2 Function calls

12.3 Set constructors

12.4 Value typecasts

12.5 Variable typecasts

12.6 Unaligned typecasts

12.7 The @ operator

12.8 Operators

12.8.1 Arithmetic operators

12.8.2 Logical operators

12.8.3 Boolean operators

12.8.4 String operators

12.8.5 Set operators

12.8.6 Relational operators

12.8.7 Class operators

12.2 Function calls

12.3 Set constructors

12.4 Value typecasts

12.5 Variable typecasts

12.6 Unaligned typecasts

12.7 The @ operator

12.8 Operators

12.8.1 Arithmetic operators

12.8.2 Logical operators

12.8.3 Boolean operators

12.8.4 String operators

12.8.5 Set operators

12.8.6 Relational operators

12.8.7 Class operators