Operatorrangfolge
AlsOperatorrangfolge,-wertigkeit,-priorität,-präzedenzoder einfach nurPräzedenzbezeichnet man inMathematik,LogikundInformatikeine definierteHalbordnung,in der dieOperatoreneines inInfix-SchreibweisevorliegendenAusdruckseine implizite Klammerung vorgeben.
Die Operatorrangfolge ist keine Totalordnung, sondern eine Halbordnung, weil es keine strikte Reihenfolge zwischenallenOperatoren geben muss. Es können auch mehrere Operatoren auf demselben Rang stehen. Zum Beispiel ist in der Arithmetik der Rang von Multiplikation und Division gleich, aber höher als der Rang von Addition und Subtraktion („Punktrechnung vor Strichrechnung“).
Durch die Rangfolge kann man explizite Klammerungen sparen. So ist in der Arithmetikgleichbedeutend mit,weil der Multiplikationsoperator einen höheren Rang hat. Für andere Anwendungen dieser Operatorsymbole können jedoch andere Rangordnungen definiert sein.
Bei nichtkommutativenOperatoren bedarf es noch zusätzlicher Konvention darüber, ob gleichrangige Teilausdrücke als implizit linksgeklammert, implizit rechtsgeklammert oder keines von beiden gelten soll.
Rangfolge unterschiedlicher Operatoren
[Bearbeiten|Quelltext bearbeiten]Für die Standard-Rechenoperationen der Mathematik ist (in absteigender Priorität) folgende Rangfolge üblich:[1][2][3]
- Potenzierung
- Multiplikation und Division („Punktrechnung “)
- Addition und Subtraktion („Strichrechnung “)
In Programmiersprachen und Computerprogrammen zur Formelauswertung (z. B. dem Unix-Dienstprogrammbc) gibt es zusätzliche Kategorien. Eine davon ist dasVorzeichen,das in der Regel eine noch höhere Priorität vor der Potenzierung genießt. So wird in mathematischen Formeln der Ausdruckzwar alsgelesen, in den Ausdrücken solcher Auswertungsprogramme aber oft als.
In der Logik ist es nicht immer üblich, eine Operatorrangfolge zu definieren. Wo das geschieht, wird meistens (in absteigender Priorität) folgende gewählt:
- Negation(logisches NICHT)
- Konjunktion(logisches UND)
- Disjunktion(logisches ODER)
- Konditional
- Bikonditional
Auch in vielen Programmiersprachen wird fürBoolesche Operatorendiese Rangfolge gewählt.
Nach Anwendung der genannten Operatorrangfolgen wird z. B. der arithmetische Ausdruckausgewertet als,der logische Ausdruckals.
Reihenfolge gleichwertiger Operatoren
[Bearbeiten|Quelltext bearbeiten]Zusätzlich kann für Operationen eineAssoziativitätfestgelegt werden, mit der bestimmt wird, in welcher Richtung nebeneinander stehende, gleichwertige Operatoren implizite Klammerung vorgeben, falls überhaupt. Ein Operator heißtlinksassoziativ,wenn A op B op C op D wie ((A op B) op C) op D gelesen werden soll; ein Operator heißtrechtsassoziativ,wenn A op B op C op D wie A op (B op (C op D)) gelesen werden soll. Von den genannten arithmetischen Operatoren wird die Potenzierung als rechtsassoziativ definiert, d. h.:
- .
Ebenso der Doppel-Pfeiloperator:
Die übrigen zweistelligen Operatoren werden als linksassoziativ definiert, d. h. zum Beispiel.
In der Logik werdenJunktorenmeistens linksassoziativ definiert, es gibt aber durchaus auch Autoren, die zumindest das Konditional rechtsassoziativ verwenden.
Es gibt auch Programmiersprachen, wie z. B.Occam,die alle Operatoren auf den gleichen Rang setzen und linksgeklammert interpretieren.
Gliederungszeichen
[Bearbeiten|Quelltext bearbeiten]Um innerhalb eines Ausdrucks die definierte Operatorrangfolge zu verändern und um bei fehlender Definition einer Rangfolge Ausdrücke eindeutig zu gestalten, werden unterschiedliche Formen von Gliederungszeichen verwendet. In der Mathematik und auch in der modernen Logik sind das Klammern.
In der Geschichte der Logik wurden vor allem zu Beginn häufig Punktierungen verwendet, um die Mehrdeutigkeit von Ausdrücken zu verhindern bzw. eine allenfalls definierte Operatorrangfolge zu verändern. Ein Punktierungssystem, das durch das GrundlagenwerkPrincipia Mathematicaeine gewisse Verbreitung erlangte, war bis in die 1970er Jahre in unterschiedlich abgewandelter Form auch in einführenden Logikbüchern häufiger anzutreffen. Bei diesem System wird statt der gedachten schließenden Klammer vor einem Junktor bzw. statt der gedachten öffnenden Klammer nach einem Junktor ein Punkt gesetzt. Zum Beispiel würde statt
der folgende Ausdruck geschrieben:
Treffen mehrere gedachte Klammern aufeinander, dann werden statt eines einzigen Punktes zwei oder mehrere Punkte gesetzt, sodass zum Beispiel anstelle von
der folgende Ausdruck geschrieben würde:
Ein anderes System gewichtet die in einem Ausdruck vorkommendenJunktorenmit Punkten. Je mehr Punkte über einem Operator stehen, desto schwächer ist seine Bindungsstärke, das heißt desto niedriger ist seine Priorität. Nach diesem System würde zum Beispiel eine Konjunktion mit zwei Punkten schwächer binden als eine Konjunktion mit einem Punkt, diese wiederum schwächer als eine Konjunktion ohne Punkte.
Sonstiges
[Bearbeiten|Quelltext bearbeiten]InProgrammiersprachenwird oft eine Wertigkeit und Assoziativität für alle Operatoren festgelegt, damit die Struktur aller Ausdrücke auch dann eindeutig ist, wenn keine Klammern verwendet werden.
Die Operatorrangfolge ist normalerweise nur bei Ausdrücken inInfix-Notationvon Bedeutung. Schreibweisen wie diepolnische Notationoder dieumgekehrte polnische Notationwurden entwickelt, damit die Ausdrücke ohne Rangfolge und klammerfrei eindeutig sind. Auch bei der ersten prädikatenlogischen Schreibweise, derBegriffsschriftnotation,und bei graphischen Schreibweisen wie denExistential Graphsist die Lesart eines Ausdrucks eindeutig bestimmt und bedarf keiner Gliederungszeichen oder -konventionen.
In Programmiersprachen, die Nebenwirkungen („side effects “) in Ausdrücken erlauben, ist die Reihenfolge, in der Teilausdrücke ausgeführt oder wirksam werden, von Bedeutung. Einige Programmiersprachen legen diese Auswertungsreihenfolge (etwaJava) strikt fest, andere (wie z. B.CoderC++) lassen die Auswertungsreihenfolge bei den meisten Infix-Operanden undefiniert. Mit der Operatorrangfolge in Sinne dieses Artikels, die eine rein syntaktische Konvention darstellt, hat dies aber nichts zu tun. Beispiel:
intf1(void);
intf2(void);
intf3(int);
intg(void){returnf3(f1()*f2());}
Es ist nicht definiert, ob zuerst f1 oder f2 ausgeführt wird (und damit „side effects “auftreten). Dagegen ist festgeschrieben, dass f3 erst aufgerufen wird, nachdem f1 und f2 (mit ihren „side effects “) beendet sind.
Die im englischsprachigen Raum benutzteEselsbrücke– PEMDAS für Parenthese (Klammer), Exponent, Multiplication, Division, Addition, Subtraction – führt immer wieder zu Missverständnissen. So wird etwagerechnet, weil in „PEMDAS “die Multiplikation vor der Division vorkommt.[4]
Literatur
[Bearbeiten|Quelltext bearbeiten]- Florian Cajori:A History of Mathematical Notations.Open Court, Chicago 1928–1929, Dover, New York 1993.ISBN 0-486-67766-4.
- William Kneale,Martha Kneale:The Development of Logic.Clarendon Press, Oxford 1962,ISBN 0-19-824773-7.
Einzelnachweise
[Bearbeiten|Quelltext bearbeiten]- ↑Taschenbuch der Mathematik(Verlag Harri DeutschundB. G. Teubner Verlagsgesellschaft), 1978–1989, 19.–24. Ausgabe,ISBN 3-87144-492-8,Band 1, S. 115–120, Kapitel 2.4.1.1
- ↑George Mark Bergman:Order of arithmetic operations
- ↑Education Place:The Order of Operations
- ↑Eric Bennett:PEMDAS is Wrong: Why Students Misunderstand the Order of Operations.28. April 2019 (englisch).