Warum hat x ++ eine höhere Priorität als ++ x?

8

Was ist der Punkt, an dem der post increment ++ Operator einen höheren Vorrang hat als der preincrement ++ Operator? Gibt es also eine Situation, in der x ++ mit der gleichen Prioritätsstufe wie ++ x dazu führt, dass ein Ausdruck ein falsches Ergebnis liefert?

    
AspOnMyNet 07.02.2010, 19:41
quelle

2 Antworten

17

Beginnen wir damit, einige Begriffe zu definieren, damit wir alle über dasselbe sprechen.

Die primären -Operatoren sind postfix "x ++" und "x--", der Mitgliedszugriffsoperator "xy", der Aufrufoperator "f (x)", der Array-Dereferenzierungsoperator "a [ x] "und die neuen Operatoren typeof, default, checked, unchecked und delegate.

Die unary -Operatoren sind "+ x", "-x", "~ x", "! x", "++ x", "--x" und die Besetzung "( T) x ".

Die primären Operatoren haben definitionsgemäß eine höhere Priorität als die unären Operatoren.

Ihre Frage ist

  

Gibt es eine Situation, in der x ++ mit der gleichen Prioritätsstufe wie ++ x dazu führt, dass ein Ausdruck ein falsches Ergebnis liefert?

Es ist mir überhaupt nicht klar, was Sie logisch mit "dem falschen Ergebnis" meinen. Wenn wir die Präzedenzregeln so geändert haben, dass sich der Wert eines Ausdrucks ändert, wäre das neue Ergebnis das richtige Ergebnis . Das richtige Ergebnis ist, was auch immer die Regeln sagen das richtige Ergebnis ist . So definieren wir "das richtige Ergebnis" - das richtige Ergebnis erhalten Sie, wenn Sie die Regeln korrekt anwenden.

Wir versuchen, die Regeln so einzurichten, dass sie nützlich sind und es Ihnen erleichtern, die Bedeutung auszudrücken, die Sie ausdrücken möchten . Meinst du damit "das falsche Ergebnis"? Das heißt, fragst du, ob es eine Situation gibt, in der die Intuition über die richtige Antwort falsch ist?

Ich unterbreite Ihnen, dass, wenn das der Fall ist, dies kein hilfreicher Standpunkt ist, denn fast keine Intuition über die" richtige "Operation der Inkrement-Operatoren entspricht tatsächlich der aktuellen Spezifikation, geschweige denn einer hypothetischen kontrafaktischen Spezifikation . In fast jedem C # -Buch, das ich bearbeitet habe, hat der Autor auf subtile oder grobe Weise die Bedeutung der Inkrementoperatoren falsch angegeben.

Dies sind Nebeneffekte mit ungewöhnlicher Semantik, die aus einer Sprache - C - mit einer bewusst vagen operativen Semantik hervorgehen. Wir haben uns bei der Definition von C # sehr bemüht, die Inkrement- und Dekrementoperatoren sinnvoll und streng definiert zu machen, aber es ist unmöglich, etwas zu finden, das für jeden intuitiv Sinn ergibt, da jeder eine andere Erfahrung mit den Operatoren in C und C ++ hat .

Vielleicht wäre es hilfreich, das Problem aus einem anderen Blickwinkel zu betrachten. Ihre Frage setzt eine kontrafaktische Welt voraus, in der Postfix und Präfix ++ den gleichen Vorrang haben, und fordert dann eine Kritik dieser Designwahl in dieser kontrafaktischen Welt. Aber es gibt viele verschiedene Möglichkeiten, die passieren könnten. Wir könnten ihnen den gleichen Vorrang einräumen, indem sie beide in die "primäre" Kategorie setzen. Oder wir könnten ihnen den gleichen Vorrang geben, indem sie beide in die Kategorie "unär" bringen. Oder wir könnten eine neue Prioritätsstufe zwischen primär und unär entwickeln. Oder unter unary. Oder über primär. Wir könnten auch die Assoziativität der Operatoren ändern, nicht nur ihre Priorität.

Vielleicht könnten Sie die Frage klären, welche kontrafaktische Welt Sie gerne kritisiert hätten. Angesichts dieser Kontrafaktuale kann ich Ihnen Kritik darüber geben, wie diese Entscheidung zu einem Code führen würde, der unnötig langwierig oder verwirrend war, aber ohne ein klares Konzept des kontrafaktischen Designs, um das Sie Kritik bitten, mache ich mir Sorgen viel Zeit damit verbringen, etwas anderes zu kritisieren, als das, was du eigentlich vorhast.

Machen Sie eine spezifische vorgeschlagene Designänderung, und wir werden sehen, was die Konsequenzen sind.

    
Eric Lippert 07.02.2010, 20:56
quelle
2

John, Sie haben die Frage selbst beantwortet: Diese beiden Konstruktionen werden meistens für Funktionsaufrufe verwendet: ++x - wenn Sie zuerst den Wert erhöhen und dann eine Funktion aufrufen möchten, und x++ , wenn Sie einen Aufruf durchführen möchten Funktion und dann eine Erhöhung. Das kann sehr nützlich sein, abhängig vom Kontext. Betrachtet man return x++ vs return ++x Ich sehe keinen Sinn für Fehler: der Code bedeutet genau, wie es liest :) Das einzige Problem ist der Programmierer, der diese beiden Konstruktionen ohne Verständnis der Vorrang des Betreibers verwenden könnte, und damit die Bedeutung fehlt.

    
dma_k 07.02.2010 21:31
quelle

Tags und Links