The awk programming language uses rules of *precedence* to determine the order in which operators within an [[expression?]] are used during evaluation. The order that operators are evaluated within an [[expression?]] are predetermined by the intepreter and the operators with the highest priority are evaluated first. An [[neophite?|inexperienced programmer]] may expect the following programming line to produce a result of 35. However, this actually produces a value of 23, because multiplication has a higher precedence than [[addition?]], so it is performed first.
print 3 + 4 * 5 # This produces 23 because multiplication is done before addition
It is possible to change the order in which operators within an [[expression?]] are evaluated by using parentheses enclosures. In the following example, the [[expression?]] produces a value of 35, because the parentheses have a higher precedence than multiplication, so their contents are evaluated first:
print (3 + 4) * 5 # The parentheses cause the addition to be evaluated before the multiplication
Groups of operators or [[function?]]s within parentheses have the same precedence as they normal would. In the following example, the multiplication within the parentheses occurs before the [[addition?]]:
print 3 * (4 + 2 * 3) # Within the parentheses 2 * 3 is evaluated before 4 is added
Operators of equal precedence are evaluated from left to right. In the following example, the [[addition?]] and [[subtraction?]] operators have equal precedence, so the operators are evaluated from left to right. This means that the [[subtraction?]] takes place before the [[addition?]], because the [[subtraction?]] operator occurs on the left side of the [[expression?]] before the [[addition?]]:
print 5 - 2 + 1
An expression that changes the value of one of its components during evaluation, may produce [[side_effects?]] and the results that it produces may vary depending on which version of awk is being used. In the following example code, the awk interpreter may produce a value of 8 or 9, depending on whether or not the [[assignment?]] in parentheses affects the value outside.
BEGIN { # Changing the number variable in the middle of the expression may introduce side effects result = (number = 4) + number # This expression may produce a value of 8 or 9 depending on the awk version print "The result is " result }
Within an [[expression?]], each operator is has a predetermined position, precedence, and [[associativity?]].
The position of the operator is the position of operator as a component within the [[expression?]], and relates to other components within the [[expression?]]:
12 + (2 x -4) + 5^2
The above [[expression?]] contains the following [[component?]]s:
Position | Component | Notes |
1 | 12 | The first component is the number 12. This is also the first element |
2 | + | The second component is the [[plus?]] operator. This is the first operator |
3 | ( | The third component is the opening bracket. The expression (2 x !-4) is the second element |
4 | 2 | The fourth component is the number 2. This is the first element of the second element |
5 | x | The fifth component is the multiplication operator. This is the first operator in the second element |
6 | - | The sixth component is the [[minus?]] operator. This is the second operator in the second element |
7 | 4 | The seventh component is the number 4. This is the second element of the second element |
8 | ) | The eighth component is the closing bracket. |
9 | + | The ninth component is the [[plus?]] operator. This is the sixth operator. |
10 | 5 | The tenth component is the number 5. The expression 5^2 is the third element |
11 | ^ | The eleventh component is the [[caret?]] exponent operator. This is the seventh operator |
12 | 2 | The twelfth component is the number 2. This is the third component of the third expression |
An operator is either a [[prefix?]] operator, a [[postfix?]] operator or an [[infix?]] operator depending upon is positioning within the [[expression?]].
A [[prefix?]] operator immediately precedes its [[operand?]]. The [[unary?]] operators used to indicate whether a number is [[positive?]] or [[negative?]] is a [[prefix?]] operator:
A [[postfix?]] operator immediately follows its [[operand?]] within an expression.
An [[infix?]] operator is positioned between its left and right [[operand?]]s:
The precedence of an operator is determined by a numerical [[value?]] representing the priority of the operator whilst determining the order in which the operators will be evaluated. Note that operators to be evaluated first have a higher value.
Operands go to the operator with the highest level of precedence
In cases where two operators of different precedences compete for the same [[operand?]], the [[operand?]] belongs to the operator with the highest precedence:
3 + 4 * 5
In the above expression, both the [[plus?]] operator and the multiplication operator are competing for the second element (numeral 4) as an [[operand?]]. Because the multiplication operator has the higher precedence, it owns the [[operand?]], so the number 4 is associated with the multiplication operator, rather than the [[addition?]] operator.
In cases where two operators of the same precedence compete for [[operand?]]s, the [[operand?]] belongs to the operator on the left:
6 + 5 - 3
In the above expression, because both the [[addition?]] and [[subtraction?]] operator have equal precedence, the second element (numeral 5) belongs to the addition operator, so the [[expression?]] is evaluated mathematically as:
(6 + 5) - 3