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.