Warum kann ich in Java nicht i ++++ oder (i ++) ++ schreiben?

7

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?

    
John Assymptoth 10.01.2011, 21:19
quelle

10 Antworten

23

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.

    
Joey 10.01.2011, 21:22
quelle
8

Der Fehler sagt Ihnen die Antwort:

%Vor%

Also wird das i ++ zu einem Wert ausgewertet, während der Operator eine Variable benötigt.

    
JOTN 10.01.2011 21:23
quelle
5

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.

    
Chris Dodd 10.01.2011 21:25
quelle
4

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

    
Ajay Bhojak 23.07.2013 13:44
quelle
2

i ++ ist im Grunde eine Abkürzung für:

(i = i + 1)

Und es wäre sinnlos zu schreiben:

(i = i + 1) ++;

richtig? :)

    
Kylar 10.01.2011 21:30
quelle
1

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.

    
Péter Török 10.01.2011 21:23
quelle
1

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ück      

jetzt 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 ++ / -

    
Dhruv Raval 06.04.2015 12:59
quelle
0

Was möchten Sie mit (i ++) ++ erreichen?

erhöhe es zweimal !!

Verwenden Sie Schleifen

In einer Schleife erhöhen:)

    
zod 10.01.2011 21:22
quelle
0

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?

    
Zeki 10.01.2011 21:29
quelle
0

Warum benutzen Sie nicht einfach den Inkrementoperator?

%Vor%

Dort.

    
Jeshurun 13.07.2011 20:01
quelle

Tags und Links