ECMA-334: 14.2.1 Operator precedence and associativity
| C# Language Specification |
| © 2006 ECMA International |
14.2.1 Operator precedence and associativity
When an expression contains multiple operators, the precedence of the operators controls the order in which
the individual operators are evaluated. [Note: For example, the expression x + y * z is evaluated as
x + (y * z) because the * operator has higher precedence than the binary + operator. end note] The
precedence of an operator is established by the definition of its associated grammar production. [Note: For
example, an additive-expression consists of a sequence of multiplicative-expressions separated by + or -
operators, thus giving the + and - operators lower precedence than the *, /, and % operators. end note]
[Note: The following table summarizes the operators in order of precedence from highest to lowest:
| Subclause | Category | Operators |
| 14.5 | Primary | x.y f(x) a[x] x++ x-- new
|
| 14.6 | Unary | + - ! ~ ++x --x (T)x
|
| 14.7 | Multiplicative | * / %
|
| 14.7 | Additive | + -
|
| 14.8 | Shift | << >>
|
| 14.9 | Relational and
type-testing | < > <= >= is as
|
| 14.9 | Equality | == !=
|
| 14.10 | Logical AND | &
|
| 14.10 | Logical XOR | ^
|
| 14.10 | Logical OR | |
|
| 14.11 | Conditional AND | &&
|
| 14.11 | Conditional OR | ||
|
| 14.12 | Null Coalescing | ??
|
| 14.13 | Conditional | ?:
|
| 14.14 | Assignment | = *= /= %= += -= <<= >>= &= ^= |=
|
end note]
When an operand occurs between two operators with the same precedence, the associativity of the operators controls the order in which the operations are performed:
- Except for the assignment operators and the null coalescing operator, all binary operators are left-associative, meaning that operations are performed from left to right. [Example:
x + y + zis evaluated as(x + y) + z. end example]
- The assignment operators, null coalescing operator and the conditional operator (
?:) are right-associative, meaning that operations are performed from right to left. [Example:x = y = zis evaluated asx = (y = z). end example]
Precedence and associativity can be controlled using parentheses. [Example: x + y * z first multiplies y
by z and then adds the result to x, but (x + y) * z first adds x and y and then multiplies the result by z. end example]