Common operator notation: Difference between revisions

Content deleted Content added
improved ref
 
(10 intermediate revisions by 8 users not shown)
Line 1:
{{about|the concept of operator precedence|operator precedence parsing|operator-precedence parser}}
{{Unreferencedrefimprove|date=August 2009}}
In [[programming languages]], [[scientific calculator]]s and similar '''common operator notation''' or '''operator grammar''' is a way to define and analyse mathematical and other formal expressions. In this model a linear sequence of tokens are divided into two classes: [[operator (programming)|operator]]s and operands.
{{Cleanup-reorganize|date=July 2007}}
In [[programming languages]], [[scientific calculator]]s and similar '''common operator notation''' or '''operator grammar''' is a way to define and analyse mathematical and other formal expressions. In this model a linear sequence of tokens are divided into two classes: [[operator (programming)|operator]]s and operands.
 
Operands are objects upon which the operators operate. These include literal [[number]]s and other constants as well as identifiers (names) which may represent anything from simple scalar variables to complex aggregated structures and objects, depending on the complexity and capability of the language at hand as well as usage context. One special type of operand is the parenthesis group. An expression enclosed in parentheses is typically recursively evaluated to be treated as a single operand on the next evaluation level.
 
Each operator is given a position, precedence, and an associativity. The '''operator precedence''' is a number (from high to low or vice versa) that defines which operator that takes an operand that is surrounded by two operators of different precedence (or priority). Multiplication normally has higher precedence than addition,<ref name="Bronstein_1987">{{cite book |title=Taschenbuch der Mathematik |title-link=Bronstein and Semendjajew |author-first1=Ilja Nikolaevič<!-- Nikolajewitsch --> |author-last1=Bronstein<!-- 1903–1976 --> |author-first2=Konstantin Adolfovič<!-- Adolfowitsch --> |author-last2=Semendjajew<!-- 1908–1988 --> |editor-first1=Günter |editor-last1=Grosche |editor-first2=Viktor |editor-last2=Ziegler<!-- 1922–1980--> |editor-first3=Dorothea |editor-last3=Ziegler |others=Weiß, Jürgen<!-- lector --> |translator-first=Viktor |translator-last=Ziegler |volume=1 |date=1987 |edition=23 |orig-year=1945 |publisher=[[:de:Verlag Harri Deutsch|Verlag Harri Deutsch]] (and [[B. G. Teubner Verlagsgesellschaft]], Leipzig) |___location=Thun and Frankfurt am Main |language=German |chapter=2.4.1.1. |pages=115-120115–120 |isbn=3-87144-492-8}}</ref> for example, so 3+4×5 = 3+(4×5) ≠ (3+4)×5.
 
In terms of operator position, an operator may be prefix, postfix, or infix. A [[prefix operator]] immediately precedes its operand, as in −x. A [[postfix operator]] immediately succeeds its operand, as in x! for instance. An [[infix operator]] is positioned in between a left and a right operand, as in x+y. Some languages, most notably the C-syntax family, stretches this conventional terminology and speaks also of ''[[ternary operator|ternary]]'' infix operators (a?b:c). Theoretically it would even be possible (but not necessarily practical) to define parenthesization as a unary bifix operation.
 
== Operator associativity ==
'''[[Operator associativity]]''', determines what happens when an operand is surrounded by operators of the same precedence, as in 1-2-3: An operator can be [[left-associative]], [[right-associative]], or [[non-associative]]. Left-associative operators are applied to operands in left-to-right order while right-associative operators are the other way round. The basic arithmetic operators are normally all left-associative,<ref name="Bronstein_1987"/> which means that 1-2-3 = (1-2)-3 ≠ 1-(2-3), for instance. This does not hold true for higher operators. For example, [[exponentiation]] is normally right-associative in mathematics,<ref name="Bronstein_1987"/> but is implemented as left-associative in some computer applications like Excel. In programming languages where assignment is implemented as an operator, that operator is often right-associative. If so, a statement like a := b := c would be equivalent to a := (b := c), which means that the value of c is copied to b which is then copied to a. An operator which is non-associative cannot compete for operands with operators of equal precedence. In [[Prolog]] for example, the infix operator :- is non-associative, so constructs such as a :- b :- c are syntax errors.
{{Main|Operator associativity}}
 
'''[[Operator associativity]]''', determines what happens when an operand is surrounded by operators of the same precedence, as in 1-2-3: An operator can be [[left-associative]], [[right-associative]], or [[non-associative]]. Left-associative operators are applied to operands in left-to-right order while right-associative operators are the other way round. The basic arithmetic operators are normally all left-associative,<ref name="Bronstein_1987" /> which means that 1-2-3 = (1-2)-3 ≠ 1-(2-3), for instance. This does not hold true for higher operators. For example, [[exponentiation]] is normally right-associative in mathematics,<ref name="Bronstein_1987" /> but is implemented as left-associative in some computer applications like Excel. In programming languages where assignment is implemented as an operator, that operator is often right-associative. If so, a statement like {{mono|1=a := b := c}} would be equivalent to {{mono|1=a := (b := c)}}, which means that the value of c is copied to b which is then copied to a. An operator which is non-associative cannot compete for operands with operators of equal precedence. In [[Prolog]] for example, the infix operator {{mono|1=:-}} is non-associative, so constructs such as {{mono|1=a :- b :- c}} are syntax errors.
Unary prefix operators such as − (negation) or sin (trigonometric function) are typically associative prefix operators. When more than one associative prefix or postfix operator of equal precedence precedes or succeeds an operand, the operators closest to the operand goes first. So −sin x = −(sin x), and sin -x = sin(-x).
 
Mathematically oriented languages (such as on [[scientific calculator]]s) sometimes allow implicit multiplication with higher priority than prefix operators (such as sin), so that sin 2x+1 = (sin(2x))+1, for instance.{{factcitation needed|date=November 2015|reason=While this may be correct for some languages, it is not correct mathematically. This needs to be discussed in much better details. See also [[Order of operations]].}}
 
However, prefix (and postfix) operators do not ''necessarily'' have higher precedence than all infix operators. Some (hypothetical) programming language may well have an operator called sin with a precedence lower than × but higher than + for instance. In such a language, sin 2·x+1 = sin(2·x)+1 would be true, instead of (sin 2)·x+1, as inwould mathematics.normally be the case.
 
The rules for expression evaluation are usually three-fold:
Line 25:
Some more examples:
 
: {{mono|1= 1-2+3/4×54*5+6+7 = (((1-2)+((3/4)×5*5))+6)+7}}
 
: {{mono|1= 4 + -x + 3 = (4 + (-x)) + 3}}
 
==Generalizations of Common Operator Notation==
Line 35:
*[[Order of operations]]
*[[Relational operator]]
*[[Operator (computer programming)]]
*[[Operators in C and C++]]