Operatorenrangfolge (nochmals)
JensG
- javascript
0 wahsaga0 Der Martin
0 JensG
0 Struppi
Hallo Struppi,
»» ich bin gerade über eine interessante Inkonsistenz gestoßen, die die Rangfolge der Operatoren betrifft:
»»
»» Variante 1: Der Operator mit dem höchsten Rang wird ALS LETZTER ausgewertet.
»»
»» Variante 2: Der Operator mit dem höchsten Rang wird ALS ERSTER ausgewertet.
»»
»» Variante 1 findet man zB. in SelfHTML (JavaScript-Operatoren), Variante 2 habe ich an mehreren Stellen gefunden:Du meinst das hier:
http://de.selfhtml.org/javascript/sprache/operatoren.htm#rangfolgeDer Operator mit der höchsten Rangstufe wird zuerst ausgeführt.
Dort steht also auch die Variante 2
Nein, eben nicht. Lies nochmal genau nach, da steht genau das Gegenteil:
[ZITAT]
12. Rangstufe: + -
13. Rangstufe: * / %
14. Rangstufe: ! ~ - ++ --
15. Rangstufe: () [] . (Klammerung und Vektoren)
Mit Hilfe von Klammern, die absichtlich die *unterste* Rangstufe in der Prioritätshierarchie darstellen, können Sie die Rangfolge bei den Operatoren beeinflussen und Ausdrücke so bewerten, wie Sie es wünschen.
[/ZITAT]
Die Operatoren werden in dieser Tabelle aber von unten nach oben (!) ausgewertet, mithin die höchste Rangstufe, nämlich 1, zuletzt.
Vergleich' das doch mal bitte erst mit den von mir genannten Alternativquellen, bevor Du die Frage so abschmetterst.
JensG
hi,
es wäre ganz sinnvoll, wenn du in solchen Fällen, wo du dich auf einen bereits archivierten Thread beziehst, diesen auch noch mal kurz heraussuchst, damit nachvollzogen werden kann, worauf du dich beziehst.
In diesem Falle also:
http://forum.de.selfhtml.org/archiv/2006/5/t129947/#m840229
gruß,
wahsaga
Hallo Jens,
»» Variante 1: Der Operator mit dem höchsten Rang wird ALS LETZTER ausgewertet.
»» Variante 2: Der Operator mit dem höchsten Rang wird ALS ERSTER ausgewertet.
Das ist nicht unbedingt ein Widerspruch.
Nimm ein einfaches Beispiel:
r = 2 + 4*(5+8)
Ein typischer Parser würde so vorgehen:
1 ersten Teilausdruck auswerten und merken: 2
2 Operator merken: Plus
3 nächsten Teilausdruck auswerten und merken: 4
4 Operator (Mal) mit letztem gemerkten vergleichen
bei niedrigerer Rangordnung: bisherige Teilausdrücke mit Operator verknüpfen,
Ergebnis merken und zurück zu Schritt 3
bei höherer Rangordnung: nächsten Teilausdruck (hier: (5+8)) auswerten und merken
und zurück zu Schritt 4
Dieses Vorgehen, das ich hier wahrscheinlich nicht mustergültig geschildert habe, führt dazu, dass beim Analysieren eines solchen komplexen Ausdrucks erst die Operatoren mit niedriger Priorität (Addition, Subtraktion) und dann die mit höherer Priorität (Multiplikation, Division) untersucht werden, dann aber in umgekehrter Reihenfolge tatsächlich berechnet werden.
Die Operatoren werden in dieser Tabelle aber von unten nach oben (!) ausgewertet, mithin die höchste Rangstufe, nämlich 1, zuletzt.
Sie werden von unten nach oben "ausgewertet", also berechnet, ja. Aber vorher werden sie von oben nach unten erstmal interpretiert.
So long,
Martin
Hallo Martin,
Das ist nicht unbedingt ein Widerspruch.
Nimm ein einfaches Beispiel:
Ein typischer Parser würde so vorgehen:
Das ist ja alles richtig. Es ging doch aber gar nicht um den Parser, sondern um den entsprechende SelfHTML-Abschnitt als solchen:
http://de.selfhtml.org/javascript/sprache/operatoren.htm#rangfolge
Vergleiche das mal mit
http://www.google.de/search?hl=de&q=Operator+Precedence+Javascript
Praktisch überall ist diese Tabelle so aufgebaut, daß der höherwertigste und damit *zuerst* bearbeitete Operator ganz oben steht - und nicht ganz unten. Überall - außer in SelfHTML.
Es ist vielleicht kein riesiges Problem, aber auf jeden Fall eine Fehlerquelle.
Und ich würde es wohl nicht hier posten, wäre ich nicht selbst hineingetappt.
JensG
Nein, eben nicht. Lies nochmal genau nach, da steht genau das Gegenteil:
[ZITAT]
12. Rangstufe: + -
13. Rangstufe: * / %
14. Rangstufe: ! ~ - ++ --
15. Rangstufe: () [] . (Klammerung und Vektoren)Mit Hilfe von Klammern, die absichtlich die *unterste* Rangstufe in der Prioritätshierarchie darstellen, können Sie die Rangfolge bei den Operatoren beeinflussen und Ausdrücke so bewerten, wie Sie es wünschen.
[/ZITAT]
Es geht ja nicht um oben oder unten.
Was ist für dich höher 1 oder 15?
Struppi.