Chapter 12

Expressions occur in assignment statements or in tests.

Expressions are built of two components: operators and their operands. Most operators are binary, i. e. require two operands. Binary operators occur always between the operands (as in X/Y). Few operators are unary, i. e. require only one operand. A unary operator occurs always before the operand, as in -X.

An expression resolves into a value of a certain type. The resulting type is determined by the types of the values in the expression and the operators in the expression.

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

Table 12.1: Precedence of operators

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:

  1. 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 ievaluated first. The result would be 22.
  2. If parentheses are used in an expression, their contents is evaluated first. Thus, 5*(3+7) would result in 50.
  3. Otherwise, binary operators of the same precedence are left-associative. 5 * 3 div 7 will evaluate to 2 and not 0.

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 subexpression is evaluated first should be made in such a case.

The compiler will decide which subexpression 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 behavior 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 notable exception to this behavior is the evaluation of boolean expressions: if short-circuit boolean evaluation is enabled (the default) then the compiler will evaluate from left to right, but will still respect precedence, i. e. in parts with equal precedence the left operand will always be evaluated before the right one. Thus, the following example:

  True or True and False

will evaluate to True, because it is equivalent to

  True or (True and False)

 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