Wenn ich versuche, ein Postfix / Präfix in / dekrement zu schreiben, gefolgt von einem post / Präfix in / dekrement, bekomme ich den folgenden Fehler: Ungültiges Argument für Operation ++ / - .
Aber laut JLS:
%Vor%und
%Vor%so schreiben:
%Vor%sollte möglich sein ... Irgendwelche Gedanken?
Beachten Sie, dass der rohen Grammatik keine Semantik fehlt. Es ist nur Syntax, und nicht jedes syntaktisch gültige Programm wird im Allgemeinen gültig sein. Zum Beispiel ist die Anforderung, dass Variablen vor der Verwendung deklariert werden müssen, in der Regel nicht von der Grammatik abgedeckt (Sie können das, aber es ist umständlich).
Postfix-increment liefert einen rvalue - und genau wie Sie keine Postfix-Inkrement-Literale haben, können Sie das Ergebnis von i++
nicht postfix-inkrementieren.
Zitieren von der JLS (3 rd ed., Seite 486):
Das Ergebnis des Postfix-Inkrementausdrucks ist keine Variable, sondern ein Wert.
Sie können ++
oder --
nur auf einen Ausdruck anwenden, der eine veränderbare Position (einen lvalue) angibt. Das ERGEBNIS eines ++
oder --
ist der Wert aus dem Ort (ein rvalue - entweder vor oder nach dem Inkrement oder Dekrement) und nicht selbst ein modifizierbarer Ort. Sie können also (a++)++
nicht mehr sagen, als Sie (a+b)++
sagen können - es gibt keinen zu ändernden Ort.
Das Problem mit diesem Ausdruck i = (i ++) ++; ist, dass (i ++) auf einen Wert aufgelöst wird und die Definition des Operators ++ dies sagt 1. wird die angegebene Variable inkrementieren und einen Wert dafür eingeben / zurückgeben, egal ob Sie Postfix oder Prefix verwenden. 2. Dieser Operator benötigt eine Variable, egal ob Präfix oder Postfix. Aber was hier passiert ist, dass (i ++) einen Wert zurückgibt und an Stelle von (i ++) setzt und dann (Wert) ++ und (Wert) ist nicht der erwartete Typ für diesen Operator, da er eine Variable anstelle eines Werts benötigt.
zum Beispiel in Java, wenn Sie das folgende Code-Snippet kompilieren, erhalten Sie den Fehler, der nach dem Snippet angezeigt wird:
öffentliche Klasse A { public void test () { int i = 0; i = (i ++) ++; } }
Kompilierungsausgabe:
A.java: 4: unerwarteter Typ benötigt: variabel gefunden: Wert i = (i ++) ++; ^ 1 Fehler
Was sollte das Ergebnis einer solchen Operation sein? Das Ergebnis von i++
ist (eine Kopie von) dem aktuellen Wert von i
, und i
wird danach inkrementiert ( post ). Wie stellst du dir vor, das Ergebnis von i++
noch einmal zu erhöhen? Wenn i
ursprünglich 1 war, was sollte sein Wert nach i++++
sein und was sollte das Ergebnis dieser Operation sein?
Wenn Sie darüber nachdenken, werden Sie wahrscheinlich feststellen, dass es sehr schwierig ist, dies richtig zu definieren. Da die Entwickler von Java die "undefinierten" C / C ++ - Traps vermeiden wollten (und da der Wert einer solchen Aussage bestenfalls zweifelhaft ist), entschieden sie sich wahrscheinlich, dies ausdrücklich zu verbieten.
Muss beachtet werden: Inkrement & amp; Dekrement (Präfix & amp; Postfix) -Operator arbeiten immer mit Variable nicht Wert
Hier erkläre ich das mit einer exe:
%Vor%oben exe.
initialisiere den Wert von i mit 0 (null)
in (i ++) '++' arbeitet mit i, das ist variabel & amp; Nach der Operation geben Sie (1)
zurückjetzt in (1) ++ '++' arbeitet mit (1) das ist value not variable, das den Regeln von java entgegengesetzt ist, deshalb kompilieren Sie den time error generate Ungültiges Argument zu Operation ++ / -
In i ++ ist ++ ein Postfix-Operator, also gibt es den Wert von i zurück und inkrementiert es dann. Was möchten Sie (i ++) ++ tun? Sollte es i + 1 seit (i ++ == i) zurückgeben? Wenn nicht, wäre das nicht seltsam, dass i ++ = i aber (i ++) ++! = I) die folgenden Ausdrücke betrachten:
%Vor%Haben Sie i + = 2 in Betracht gezogen?