fbpx
Wikipedia

Operator associativity

In programming language theory, the associativity 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, ^ 3 ^), 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 associative (meaning the operations can be grouped arbitrarily), left-associative (meaning the operations are grouped from the left), right-associative (meaning the operations are grouped from the right) or non-associative (meaning operations cannot be chained, often because the output type is incompatible with the input types). 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, are both left and right associative. (e.g. (a * b) * c = a * (b * c)).

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. (For example, 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. (For example, subtraction does not have the associative property, therefore it must have notational associativity.)

Examples edit

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 usage, addition, subtraction, multiplication, and division operators are usually left-associative,[1][2][3][4][5] while for an exponentiation operator (if present)[6] and Knuth's up-arrow operators there is no general agreement. Any assignment operators are 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 edit

Consider the expression 5^4^3^2, in which ^ is taken to be a right-associative exponentiation operator. 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:

  1. Term 5 is read.
  2. Nonterminal ^ is read. Node: "5^".
  3. Term 4 is read. Node: "5^4".
  4. Nonterminal ^ is read, triggering the right-associativity rule. Associativity decides node: "5^(4^".
  5. Term 3 is read. Node: "5^(4^3".
  6. Nonterminal ^ is read, triggering the re-application of the right-associativity rule. Node "5^(4^(3^".
  7. Term 2 is read. Node "5^(4^(3^2".
  8. 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 ^):

  1. The evaluator walks down the tree, from the first, over the second, to the third ^ expression.
  2. It evaluates as: 32 = 9. The result replaces the expression branch as the second operand of the second ^.
  3. Evaluation continues one level up the parse tree as: 49 = 262,144. Again, the result replaces the expression branch as the second operand of the first ^.
  4. Again, the evaluator steps up the tree to the root expression and evaluates as: 52621446.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 result (6253)2 = 244,140,62525.9604645×1016.

Right-associativity of assignment operators edit

In many imperative programming languages, the assignment operator is defined to be right-associative, and assignment is defined to be an expression (which evaluates to a value), not just a statement. This allows chained assignment by using the value of one assignment expression as the right operand of the next assignment expression.

In C, the assignment a = b is an expression that evaluates to the same value as the expression b converted to the type of a, with the side effect of storing the R-value of b into the L-value of a.[a] Therefore the expression a = (b = c) can be interpreted as b = c; a = b;. The alternative expression (a = b) = c raises an error because a = b is not an L-value expression, i.e. it has an R-value but not an L-value where to store the R-value of c. The right-associativity of the = operator allows expressions such as a = b = c to be interpreted as a = (b = c).

In C++, the assignment a = b is an expression that evaluates to the same value as the expression a, with the side effect of storing the R-value of b into the L-value of a. Therefore the expression a = (b = c) can still be interpreted as b = c; a = b;. And the alternative expression (a = b) = c can be interpreted as a = b; a = c; instead of raising an error. The right-associativity of the = operator allows expressions such as a = b = c to be interpreted as a = (b = c).

Non-associative operators edit

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 is that sequences of certain operators are interpreted in some other way, which cannot be expressed as associativity. This generally means that syntactically, there is a special rule for sequences of these operations, and semantically the behavior is different. A good example is in Python, which has several such constructs.[7] Since assignments are statements, not operations, the assignment operator does not have a value and is not associative. Chained assignment is instead implemented by having a grammar rule for sequences of assignments a = b = c, which are then assigned left-to-right. Further, combinations of assignment and augmented assignment, like a = b += c are not legal in Python, though they are legal in C. Another example are comparison operators, such as >, ==, and <=. A chained comparison like a < b < c is interpreted as (a < b) and (b < c), not equivalent to either (a < b) < c or a < (b < c).[8]

See also edit

Notes edit

  1. ^ 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.

References edit

  1. ^ Bronstein, Ilja Nikolaevič; Semendjajew, Konstantin Adolfovič (1987) [1945]. "2.4.1.1.". In Grosche, Günter; Ziegler, Viktor; Ziegler, Dorothea (eds.). Taschenbuch der Mathematik (in German). Vol. 1. Translated by Ziegler, Viktor. Weiß, Jürgen (23 ed.). Thun and Frankfurt am Main: Verlag Harri Deutsch (and B. G. Teubner Verlagsgesellschaft, Leipzig). pp. 115–120. ISBN 3-87144-492-8.
  2. ^ Chemnitz University of Technology: Priority and associativity of operators (archived translation)
  3. ^ Education Place: The Order of Operations
  4. ^ Khan Academy: The Order of Operations, timestamp 5m40s
  5. ^ Virginia Department of Education: Using Order of Operations and Exploring Properties, section 9
  6. ^ Exponentiation Associativity and Standard Math Notation Codeplea. 23 Aug 2016. Retrieved 20 Sep 2016.
  7. ^ The Python Language Reference, "6. Expressions"
  8. ^ The Python Language Reference, "6. Expressions": 6.9. Comparisons

operator, associativity, mathematical, concept, associativity, associative, property, programming, language, theory, associativity, operator, property, that, determines, operators, same, precedence, grouped, absence, parentheses, operand, both, preceded, follo. For the mathematical concept of associativity see Associative property In programming language theory the associativity 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 3 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 associative meaning the operations can be grouped arbitrarily left associative meaning the operations are grouped from the left right associative meaning the operations are grouped from the right or non associative meaning operations cannot be chained often because the output type is incompatible with the input types 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 are both left and right associative e g a b c a b c 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 For example 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 For example subtraction does not have the associative property therefore it must have notational associativity Contents 1 Examples 1 1 A detailed example 2 Right associativity of assignment operators 3 Non associative operators 4 See also 5 Notes 6 ReferencesExamples editAssociativity 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 usage addition subtraction multiplication and division operators are usually left associative 1 2 3 4 5 while for an exponentiation operator if present 6 and Knuth s up arrow operators there is no general agreement Any assignment operators are 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 edit Consider the expression 5 4 3 2 in which is taken to be a right associative exponentiation operator 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 262 144 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 result 6253 2 244 140 6252 5 9604645 1016 Right associativity of assignment operators editIn many imperative programming languages the assignment operator is defined to be right associative and assignment is defined to be an expression which evaluates to a value not just a statement This allows chained assignment by using the value of one assignment expression as the right operand of the next assignment expression In C the assignment a b is an expression that evaluates to the same value as the expression b converted to the type of a with the side effect of storing the R value of b into the L value of a a Therefore the expression a b c can be interpreted as b c a b The alternative expression a b c raises an error because a b is not an L value expression i e it has an R value but not an L value where to store the R value of c The right associativity of the operator allows expressions such as a b c to be interpreted as a b c In C the assignment a b is an expression that evaluates to the same value as the expression a with the side effect of storing the R value of b into the L value of a Therefore the expression a b c can still be interpreted as b c a b And the alternative expression a b c can be interpreted as a b a c instead of raising an error The right associativity of the operator allows expressions such as a b c to be interpreted as a b c Non associative operators editNon 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 is that sequences of certain operators are interpreted in some other way which cannot be expressed as associativity This generally means that syntactically there is a special rule for sequences of these operations and semantically the behavior is different A good example is in Python which has several such constructs 7 Since assignments are statements not operations the assignment operator does not have a value and is not associative Chained assignment is instead implemented by having a grammar rule for sequences of assignments a b c which are then assigned left to right Further combinations of assignment and augmented assignment like a b c are not legal in Python though they are legal in C Another example are comparison operators such as gt and lt A chained comparison like a lt b lt c is interpreted as a lt b and b lt c not equivalent to either a lt b lt c or a lt b lt c 8 See also editOrder of operations in arithmetic and algebra Common operator notation in programming languages Associativity the mathematical property of associativity Notes edit 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 References edit Bronstein Ilja Nikolaevic Semendjajew Konstantin Adolfovic 1987 1945 2 4 1 1 In Grosche Gunter Ziegler Viktor Ziegler Dorothea eds Taschenbuch der Mathematik in German Vol 1 Translated by Ziegler Viktor Weiss Jurgen 23 ed Thun and Frankfurt am Main Verlag Harri Deutsch and B G Teubner Verlagsgesellschaft Leipzig pp 115 120 ISBN 3 87144 492 8 Chemnitz University of Technology Priority and associativity of operators archived translation Education Place The Order of Operations Khan Academy The Order of Operations timestamp 5m40s Virginia Department of Education Using Order of Operations and Exploring Properties section 9 Exponentiation Associativity and Standard Math Notation Codeplea 23 Aug 2016 Retrieved 20 Sep 2016 The Python Language Reference 6 Expressions The Python Language Reference 6 Expressions 6 9 Comparisons Retrieved from https en wikipedia org w index php title Operator associativity amp oldid 1165913819, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.