Heim >Backend-Entwicklung >C++ >Was sagen uns Operatorprioritäts- und Assoziativitätstabellen eigentlich über die Ausdrucksauswertung in Programmiersprachen?

Was sagen uns Operatorprioritäts- und Assoziativitätstabellen eigentlich über die Ausdrucksauswertung in Programmiersprachen?

DDD
DDDOriginal
2024-11-01 12:32:02778Durchsuche

What do operator precedence and associativity tables actually tell us about expression evaluation in programming languages?

Operatorpriorität und Assoziativität: Definition und Beziehung zur Auswertungsreihenfolge

Einführung

In die Programmierung Sprachen, Operatorpriorität und Assoziativität bestimmen die Reihenfolge, in der Operatoren ausgewertet werden. Während viele Programmierlehrbücher Tabellen enthalten, in denen diese Eigenschaften aufgeführt sind, stellen sich Fragen zu ihrer Interpretation und der Quelle ihrer Definition.

Fragen

  1. Wenn die Vorstellung, dass Funktionen sind immer von links nach rechts ausgewertet wird, ist falsch. Was sagt die Operatorprioritäts- und Assoziativitätstabelle wirklich aus?
  2. Wer legt Operatorpriorität und Assoziativität fest, wenn nicht der ANSI-Standard? Wenn ANSI es definiert, warum gibt es dann so wenig explizite Erwähnung im Standard? Werden diese Informationen aus dem ANSI C-Standard abgeleitet oder an anderer Stelle festgelegt?

Antwort

Operatorpriorität und Assoziativitätsdefinition

Operatorpriorität und Assoziativität werden im Sprachstandard selbst definiert. Die Standardgrammatik legt die Regeln für die Bildung von Ausdrücken fest. Durch die Untersuchung dieser Regeln können die Rangfolge und Assoziativität von Operatoren abgeleitet werden.

In C lautet die Grammatik für additive Ausdrücke (Addition und Subtraktion) beispielsweise wie folgt:

additive-expression:
  multiplicative-expression
  additive-expression + multiplicative-expression
  additive-expression - multiplicative-expression

Aus dieser Regel können wir ableiten, dass multiplikative Ausdrücke (Multiplikation und Division) eine höhere Priorität haben als additive Ausdrücke, da sie Unterregeln additiver Ausdrücke sind. Darüber hinaus kann die Links-nach-rechts-Assoziativität der Operatoren und - aus der Regel abgeleitet werden, die besagt, dass ein additiver Ausdruck rekursiv aus anderen additiven Ausdrücken zusammengesetzt werden kann.

Reihenfolge der Auswertung

Es ist wichtig, zwischen Operatorpriorität und Assoziativität sowie der Reihenfolge der Auswertung zu unterscheiden. Während Rangfolge und Assoziativität bestimmen, wie Operatoren gruppiert werden, bezieht sich die Auswertungsreihenfolge auf die Reihenfolge, in der einzelne Ausdrücke ausgewertet werden. In C wird nicht garantiert, dass Auswertungen streng nach Priorität und Assoziativität erfolgen.

Zum Beispiel hat im Ausdruck f1() f2() * f3() der *-Operator eine höhere Priorität als der Operator, was dazu führt in der Gruppierung f1() (f2() * f3()). Die Reihenfolge der Auswertung ist jedoch nicht definiert, was bedeutet, dass f3(), f1() oder f2() zuerst ausgewertet werden könnten.

Bestimmte Operatoren, wie zum Beispiel der logische ODER-Operator (||), tun dies Erlegen Sie ihrer Operandenauswertung eine Reihenfolge auf, die einen Kurzschluss ermöglicht. In x || y, x wird immer vor y ausgewertet, um festzustellen, ob eine Auswertung von y erforderlich ist.

Das obige ist der detaillierte Inhalt vonWas sagen uns Operatorprioritäts- und Assoziativitätstabellen eigentlich über die Ausdrucksauswertung in Programmiersprachen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn