Expressions And Operators: Some Basics

An expression involves one or more terms and zero or more operators. Consider the following:

``````\$result = get_value(123, "Monday", true);
``````

This is an expression, which contains other (sub)expressions: the source code elements `\$result`, `getvalue`, `123`, `"Monday"`, and `true`; the operators assignment `=` and function-call `()`; and the subexpression `get_value(123, "Monday", true)`.

A side-effect is an action that changes the state of the execution environment. (Examples of such actions are modifying a variable, writing to a file, or calling a function that performs such operations.)

When an expression is evaluated, it produces a result. It might also produce a side-effect. The occurrence of value computation and side-effects is delimited by sequence points, places in a program's execution at which all the computations and side-effects previously promised are complete, and no computations or side-effects of future operations have yet begun.

There is a sequence point at the end of each full expression. The `&&`, `||`, `? :` and function-call operators each contain a sequence point. For example, in the following series of statements:

``````\$a = 10; ++\$a; \$b = \$a;
``````

there is sequence point at the end of each full expression, so the assignment to \$a is completed before `\$a` is incremented, and the increment is completed before the assignment to `\$b`.

Precedence and Associativity

When an expression contains multiple operators, the precedence of those operators controls the order in which those operators are applied. For example, the expression

``````\$a - \$b / \$c
``````

is evaluated as:

``````\$a - (\$b / \$c)
``````

because the division (`/`) operator has higher precedence than the binary subtraction `-` operator. The precedence of all operators is defined in operator precedence.

If an operand occurs between two operators having the same precedence, the order in which the operations are performed is defined by those operators' associativity. With left-associative operators, operations are performed left-to-right. For example:

``````\$a + \$b - \$c`
``````

is evaluated as:

``````(\$a + \$b) - \$c
``````

With right-associative operators, operations are performed right-to-left.

Precedence and associativity can be controlled using grouping parentheses. For example, in the following expression:

``````(\$a - \$b) / \$c
``````

The subtraction is done before the division. Without the grouping parentheses, the division would take place first.

While precedence, associativity, and grouping parentheses control the order in which operators are applied, they do not control the order of evaluation of the terms themselves. Unless stated otherwise, the order in which the operands in an expression are evaluated relative to each other is unspecified.