![]() |
VOOZH | about |
In C, expressions often contain multiple operators, and the order of evaluation affects the result. Operator precedence and associativity are rules that decide which operator is applied first and in which direction operators of the same precedence are evaluated.
12
Explanation: The above expression is evaluated as 6 + ( (3 * 4) / 2) = 12, not (6 + 3) * (4 / 2) = 18. So what guided the compiler to evaluate the expression in this way? It is actually the precedence and associativity of the operators used in this expression.
610
As we can see, the expression is evaluated as,10 + (20 * 30) but not as (10 + 20) * 30 due to * operator having higher precedence.
0
Operators Precedence and Associativity are two characteristics of operators that determine the evaluation order of sub-expressions.
👁 operator precedence and associativity
90
The following tables list the C operator precedence from highest to lowest and the associativity for each of the operators:
Precedence | Operator | Description | Associativity |
|---|---|---|---|
1 | () | Parentheses (function call) | Left-to-Right |
[] | Array Subscript (Square Brackets) | ||
. | Dot Operator | ||
-> | Structure Pointer Operator | ||
++ , -- | Postfix increment, decrement | ||
2 | ++ / -- | Prefix increment, decrement | Right-to-Left |
+ / - | Unary plus, minus | ||
! , ~ | Logical NOT, Bitwise complement | ||
(type) | Cast Operator | ||
* | Dereference Operator | ||
& | Addressof Operator | ||
sizeof | Determine size in bytes | ||
3 | *,/,% | Multiplication, division, modulus | Left-to-Right |
4 | +/- | Addition, subtraction | Left-to-Right |
5 | << , >> | Bitwise shift left, Bitwise shift right | Left-to-Right |
6 | < , <= | Relational less than, less than or equal to | Left-to-Right |
> , >= | Relational greater than, greater than or equal to | ||
7 | == , != | Relational is equal to, is not equal to | Left-to-Right |
8 | & | Bitwise AND | Left-to-Right |
9 | ^ | Bitwise exclusive OR | Left-to-Right |
10 | | | Bitwise inclusive OR | Left-to-Right |
11 | && | Logical AND | Left-to-Right |
12 | || | Logical OR | Left-to-Right |
13 | ?: | Ternary conditional | Right-to-Left |
14 | = | Assignment | Right-to-Left |
+= , -= | Addition, subtraction assignment | ||
*= , /= | Multiplication, division assignment | ||
%= , &= | Modulus, bitwise AND assignment | ||
^= , |= | Bitwise exclusive, inclusive OR assignment | ||
<<=, >>= | Bitwise shift left, right assignment | ||
15 | , | comma (expression separator) | Left-to-Right |
Easy Trick to Remember the Operators Associtivity and Precedence: PUMA'S REBL TAC
where, P = Postfix, U = Unary, M = Multiplicative, A = Additive, S = Shift, R = Relational, E = Equality, B = Bitwise, L = Logical, T = Ternary, A = Assignment and C = Comma
There are a few important points and cases that we need to remember for operator associativity and precedence which are as follows:
The point to note is associativity doesn't define the order in which operands of a single operator are evaluated. For example, consider the following program, associativity of the + operator is left to right, but it doesn't mean f1() is always called before f2(). The output of the following program is in-fact compiler-dependent.
10
You can check this article for more details.
Parenthesis ( ) got the highest priority among all the C operators. So, if we want to change the order of evaluation in an expression, we can enclose that particular operator in ( ) parenthesis along with its operands.
Consider the given expression
100 + 200 / 10 - 3 * 10
= 90
But if we enclose 100 + 200 in parenthesis, then the result will be different.
(100 + 200) / 10 - 3 * 10
= 0
As the + operator will be evaluated before / operator.
This is necessary, otherwise, there won't be any way for the compiler to decide the evaluation order of expressions that have two operators of the same precedence and different associativity. For example + and - have the same associativity.
The precedence of postfix ++ is more than prefix ++, their associativity is also different. The associativity of postfix ++ is left to right and the associativity of prefix ++ is right to left. Check this article for more details.
1
In Python, an expression like "c > b > a" is treated as "c > b and b > a", but this type of chaining doesn't happen in C. For example, consider the following program. The output of the following program is "FALSE".
FALSE