The operator precedence and associativity rules specify the order in which operators in an expression are bound to the operands. These rules enable us to interpret the meaning of an expression in an unambiguous manner.
Table gives the arithmetic and assignment operators in the order of their precedence which is as follows: unary, multiplicative, additive and assignment. Thus, the unary arithmetic operators have the highest precedence. They are followed by multiplicative operators, which in turn have higher precedence than additive operators. The assignment operators have lower precedence than all the arithmetic operators.
Precedence and associativity of arithmetic and assignment operators in C language
Operator group | Operators | Associativity |
Unary operators | + – ++ — | Right to left |
Multiplicative operators | * /% | Left to right |
Additive operators | + – | Left to right |
Assignment operators | = += -= *= /= %= | Right to left |
An operator having higher precedence is bound to its operand(s) before the operators having a lower precedence. For example, in the expression a+ b * c, the * operator, which has higher precedence than the + operator, is bound first to its operands. Thus the expression is evaluated as a+ (b * c) and not as (a+ b) * c.
All operators in an operator group have equal precedence. Thus, all unary operators ( + – ++ – – ) have equal precedence. The same is true with multiplicative operators ( * /%), additive operators (+ -)and assignment operators (= += -= *= /= %=).
Let us consider a simple calculation involving a sum and a multiplication
10 + 3 * 4.
If the above expression is evaluated as 10 + (3*4) the result is 22. To arrive at this result we first multiply 3 and 4 and then add the product 12to l 0 as illustrated in Fig. The figure shows that operation in white box is carried out first. This makes the result equal to 22. This implies that multiplication has higher priority or precedence than the addition. On the other hand, if we first add 3 to 10 and then multiply the result by 4 the result would be 52 instead of 22. Each operator has a precedence level which decides its priority (turn) for operation in an expression involving several operators. The operator with highest precedence is performed first followed by the one with the next lower precedence. The precedence levels of the operators are set in the compiler and computer follows these rules during calculations. In the above case, 22 is the right answer.
Now, if a number of operators having the same precedence level are there in a statement then how do we decide which of them should be performed first. For example, consider the following calculation:
N = 28/7 % 5 * 2
In the above expression, the operators for division, modulus, and multiplication all have the same level of priority and all the three are binary operators. In the above expression, if the operations are performed from right to left, the result of 5*2 is 10 and of 7%10 is 7 and 28/7 is 4. However, if we perform the same operations from left to right, the division 28/7 results in 4 and the operation 4%5 results in 4 and the next operation 4*2 results in 8. So, in the first case (right to left) we obtain the result as 4, while in the second case (left to right) we get the result as 8. Which of the two is correct? In such cases the associativity of the operators has to be taken into account. The associativity of all the operators except = in the above expression is from left to right. The sequence of operation is illustrated in Fig. The operation shown in white box is the current operation.
The associativity of the operator= is from right to left. In this case, the value 8 is assigned to N. The value written on left side of= is also called l-value. On the right of= we write the value to be assigned to l-value. Here, 8 is r-value which is assigned to l-value which is N.