Operator-Vorrang-Problem führt zu "Fehler: unerwarteter Typ"

8

Da in letzter Zeit so viele Fragen zum Vorrang von Operatoren aufgetreten sind, habe ich angefangen, mit etwas Code zu spielen und kam dabei auf:

%Vor%

Dies ergibt:

%Vor%

Ich habe das versucht, weil ich interessiert war, wie java mit der Tatsache umgehen würde, dass postfix eine höhere Priorität als prefix hat. Dies scheint so zu sein, als ob die obige Aussage zu einem Widerspruch führen würde, der durch diesen Fehler behandelt wird.

Meine Frage ist zweifach:

  1. Warum dieser Fehler? Was genau bedeutet das?
  2. Warum hat postfix eine höhere Priorität als prefix ? Ich bin mir sicher, dass es einen guten Grund dafür gibt, aber ich konnte mir keinen vorstellen. Vielleicht würde es dieses undefinierte Verhalten beheben, aber es würde irgendwie zu mehr Problemen führen?
Steve P. 24.07.2013, 15:13
quelle

4 Antworten

12

Die Ursache des Fehlers besteht darin, dass x++ einen Wert erzeugt und Sie einen Dekrementierungsoperator nicht auf einen Wert, sondern nur auf eine Variable anwenden können. Wenn beispielsweise x = 41, wird x++ zu 41 ausgewertet, nicht zu der Variablen x und --(41) ist bedeutungslos.

Warum Postfix eine höhere Priorität als Präfix hat, ist meine Vermutung, dass es Mehrdeutigkeit mit anderen Operatoren während der Analyse vermeiden soll. Der Compiler kann beispielsweise einen Syntaxfehler für x--x melden, anstatt ihn als x-(-x) zu analysieren.

    
Joni 24.07.2013, 15:18
quelle
4

probiere

aus %Vor%

Sie erhalten den gleichen Fehler. Post / pre-Operator werden auf Variable angewendet, nicht auf irgendeine Zahl. Deshalb erhalten Sie Fehler

%Vor%

Weil es eine Variable erwartet, keine Nummer. Angenommen, Ihre Nummer ist 3

%Vor%

Ich weiß nicht, was genau Sie in der zweiten Frage fragen wollen. Aber nimm Szenario

%Vor%

hier wird es auch von links nach rechts betrieben, was zu

kommt %Vor%     
M Sach 24.07.2013 15:18
quelle
2

x selbst ist eine Variable, sie kann geändert werden, also kannst du ++x oder x++ machen.

Aber wenn Sie --x++ verwenden, wird -- auf x++ angewendet, was nicht geändert werden kann, da es ein Wert und keine Variable ist.

    
Maroun 24.07.2013 15:18
quelle
2

Technisch gesehen ist eine Entität in einem Ausdruck entweder ein "lval" oder ein "rval". "lval" ist ein "linker Wert" (auf der linken Seite von x = y ) und kann zugewiesen werden. "rval" ist ein "rechter Wert" und kann nicht zugewiesen werden. Sie können ein "lval" verwenden, für das ein "rval" aufgerufen wird, aber nicht umgekehrt. ++ und -- erfordern "lvals".

Ein "lval" kann ein einfacher Variablenname oder ein dereferenzierter Zeiger oder ein Array-Indizierungsausdruck (und wahrscheinlich 2-3 andere) sein.

    
Hot Licks 24.07.2013 16:13
quelle

Tags und Links