In programming languages and mathematical notation, the associativity (or fixity) of an operator is a property that determines how operators of the same precedence are grouped in the absence of parentheses. If an operand is both preceded and followed by operators (for example, "^ 4 ^"), and those operators have equal precedence, then the operand may be used as input to two different operations (i.e. the two operations indicated by the two operators). The choice of which operations to apply the operand to, is determined by the "associativity" of the operators. Operators may be left-associative (meaning the operations are grouped from the left), right-associative (meaning the operations are grouped from the right) or non-associative (meaning there is no defined grouping). The associativity and precedence of an operator is a part of the definition of the programming language; different programming languages may have different associativity and precedence for the same type of operator.
Consider the expression a ~ b ~ c. If the operator ~ has left associativity, this expression would be interpreted as (a ~ b) ~ c. If the operator has right associativity, the expression would be interpreted as a ~ (b ~ c). If the operator is non-associative, the expression might be a syntax error, or it might have some special meaning. Some mathematical operators have inherent associativity. For example, subtraction and division, as used in conventional math notation, are inherently left-associative. Addition and multiplication, by contrast, have no inherent associativity, though most programming languages define an associativity for these operations as well.
Many programming language manuals provide a table of operator precedence and associativity; see, for example, the table for C and C++.
The concept of notational associativity described here is related to, but different from the mathematical associativity. An operation that is mathematically associative, by definition requires no notational associativity (e.g. addition has the associative property, therefore it does not have to be either left associative or right associative). An operation that is not mathematically associative, however, must be notationally left-, right-, or non-associative (e.g. subtraction does not have the associative property, therefore it must have notational associativity).
Associativity is only needed when the operators in an expression have the same precedence. Usually + and - have the same precedence. Consider the expression 7 − 4 + 2. The result could be either (7 − 4) + 2 = 5 or 7 − (4 + 2) = 1. The former result corresponds to the case when + and − are left-associative, the latter to when + and - are right-associative.
In order to reflect normal mathematical usage, addition, subtraction, multiplication, and division operators are usually left-associative while an exponentiation operator (if present) is right-associative. Any assignment operators are also typically right-associative. To prevent cases where operands would be associated with two operators, or no operator at all, operators with the same precedence must have the same associativity.
A detailed example 
Consider the expression 5^4^3^2. A parser reading the tokens from left to right would apply the associativity rule to a branch, because of the right-associativity of ^, in the following way:
- Term 5 is read.
- Nonterminal ^ is read. Node: "5^".
- Term 4 is read. Node: "5^4".
- Nonterminal ^ is read, triggering the right-associativity rule. Associativity decides node: "5^(4^".
- Term 3 is read. Node: "5^(4^3".
- Nonterminal ^ is read, triggering the re-application of the right-associativity rule. Node "5^(4^(3^".
- Term 2 is read. Node "5^(4^(3^2".
- No tokens to read. Apply associativity to produce parse tree "5^(4^(3^2))".
This can then be evaluated depth-first, starting at the top node (the first ^):
- The evaluator walks down the tree, from the first, over the second, to the third ^ expression.
- It evaluates as: 32 = 9. The result replaces the expression branch as the second operand of the second ^.
- Evaluation continues one level up the parse tree as: 49 = 262144. Again, the result replaces the expression branch as the second operand of the first ^.
- Again, the evaluator steps up the tree to the root expression and evaluates as: 5262144 ≈ 6.2060699 × 10183230. The last remaining branch collapses and the result becomes the overall result, therefore completing overall evaluation.
A left-associative evaluation would have resulted in the parse tree ((5^4)^3)^2 and the completely different results 625, 244140625 and finally ~5.9604645 × 1016.
Right-associativity of assignment operators 
Assignment operators in imperative programming languages are usually defined to be right-associative. For example, in C, the assignment a = b is an expression that returns a value (namely, b converted to the type of a) with the side effect of setting a to this value. An assignment can be performed in the middle of an expression. (An expression can be made into a statement by following it with a semicolon; i.e. a = b is an expression but a = b; is a statement). The right-associativity of the = operator allows expressions such as a = b = c to be interpreted as a = (b = c), thereby setting both a and b to the value of c. The alternative (a = b) = c does not make sense because a = b is not a value. However, in C++ an assignment a = b returns a value referring to the left term in the assignment. Therefore (a = b) = c can be interpreted as a = b; a = c;.
Non-associative operators 
Non-associative operators are operators that have no defined behavior when used in sequence in an expression. In Prolog, the infix operator :- is non-associative because constructs such as "a :- b :- c" constitute syntax errors.
Another possibility distinct from left- or right-associativity is that the expression is legal but has different semantics. An example is the comparison operators (such as >, ==, and <=) in Python: a < b < c is shorthand for (a < b) and (b < c), not equivalent to either (a < b) < c or a < (b < c).
See also 
- Order of operations (in arithmetic and algebra)
- Common operator notation (in programming languages)
- Associativity (the mathematical property of associativity)