Warum funktioniert der Post-Increment-Operator nicht bei einer Methode, die ein int zurückgibt?

Lesezeit: 4 Minuten

Benutzer-Avatar
Blundell

public void increment(){
    int zero = 0;

    int oneA = zero++; // Compiles

    int oneB = 0++; // Doesn't compile

    int oneC = getInt()++; // Doesn't compile
}

private int getInt(){
    return 0;
}

Sie sind alle ints, warum wird B & C nicht kompiliert? Hat es mit dem Weg zu tun ++ Betreiber unterscheidet sich von = 0 + 1;?

Ungültiges Argument für Operation ++/–

  • Eine Randbemerkung: So wie Sie Ihre Variablen benannt haben, scheinen Sie davon auszugehen int oneA = zero++; weist zu eines zu oneA. Das ist falsch. Das Post Inkrement-Operator gibt die zurück alt (nicht inkrementierter) Wert. Nach int oneA = zero++;, oneA ist 0 und zero ist 1.

    – Heinzi

    8. März 2013 um 12:28 Uhr


  • In Ihrem Code würden Sie also nicht einfach automatisch schreiben int oneC = getInt() + 1; ?

    – Warren P

    8. März 2013 um 14:05 Uhr

  • Zwei Fehler im Code – einer könnte ein Versehen sein; das andere ist das Missverständnis, das der Frage zugrunde liegt. NARQ basiert auf einem Missverständnis.

    – Kris

    9. März 2013 um 10:02 Uhr

  • @Kris ++ verwirrt. Es gibt viele Fragen ++ Sobald die Lösung fertig ist, sieht es einfach aus.

    – Grijesh Chauhan

    9. März 2013 um 10:12 Uhr

  • @Kris: Die Tatsache, dass die Antwort auf eine Frage für Sie offensichtlich ist, ist kein Grund dafür, dass die Frage wertlos ist. ++ ist für viele Leute wirklich verwirrend, und die meisten, für die es nicht ist, haben Fehler damit gemacht und daraus gelernt.

    – Falanwe

    13. März 2013 um 10:22 Uhr

Benutzer-Avatar
xlecoustillier

i++ ist eine Zuweisung an eine Variable i.

In Ihrem Fall, zero++ ist ein Äquivalent zu zero = zero + 1. So 0++ würde bedeuten 0 = 0 + 1was keinen Sinn macht, sowie getInt() = getInt() + 1.

Genauer :

int oneA = zero++;

meint

int oneA = zero;
zero = zero + 1; // OK, oneA == 0, zero == 1

int oneB = 0++;

meint

int oneB = 0;
0 = 0 + 1; // wrong, can't assign value to a value.

int oneC = getInt()++;

meint

int oneC = getInt();
getInt() = getInt() + 1; // wrong, can't assign value to a method return value.

Aus allgemeinerer Sicht ist eine Variable a L-Wertbezieht sich also auf einen Speicherplatz und kann somit zugeordnet werden. L in L-Wert steht für links Seite des Zuweisungsoperators (dh =), auch wenn L-Werte entweder auf der linken oder auf der rechten Seite des Zuweisungsoperators zu finden sind (x = y zum Beispiel).

Das Gegenteil ist R-Wert (R steht für Rechts Seite des Zuweisungsoperators). R-Werte können nur auf der rechten Seite von Zuweisungsanweisungen verwendet werden, um einem L-Wert etwas zuzuweisen. Typischerweise sind R-Werte Literale (Zahlen, Zeichenfolgen …) und Methoden.

  • Ah natürlich duh, weil es eine Aufgabe macht, dann macht B & C ja keinen Sinn!

    – Blundell

    8. März 2013 um 10:34 Uhr

  • +1, ich möchte nur einen kleinen Kommentar zu dieser Antwort hinzufügen, ‘i’ ist eine Speicherzuweisung, die einen Wert enthält und eine Adresse hat, also bedeutet i++, dass 1-zu der Adresse im Speicher 2-den Wert in dieser Adresse abrufen 3-inkrementieren Sie es 4-ordnen Sie den Wert erneut in dieser Adresse ‘i=i+1’ zu. Wenn wir also die Variable nicht wie :int x initialisieren, dann x++; Wir erhalten einen Fehler, weil diese Adresse keinen Wert enthält. Im Falle von 0++ macht es keinen Sinn, da 0 nur ein Wert ist

    – Alya’a Gamal

    8. März 2013 um 11:02 Uhr

  • Tatsächlich scheint i = i + 1 äquivalent zu ++i zu sein, nicht zu i++. (Eigentlich war ich etwas schockiert, als ich sah, dass Zuweisungen in Java zu Werten führen.)

    – Frank vom Fernsehen

    8. März 2013 um 12:24 Uhr

  • @TV’sFrank du hast recht, i=i+1 entspricht ++i. Und Zuweisung hat einen Wert, genau wie in C und vielen anderen Sprachen. So können Sie Sachen schreiben wie i=j=0;

    – j.karlsson

    8. März 2013 um 12:36 Uhr

  • Sie haben Recht. Aber in diesem Fall ist das Ergebnis dasselbe: 0 = 0 ; 0 + 1; oder getInt() = getInt(); getInt() + 1; macht nicht mehr sinn 🙂

    – xlecoustillier

    8. März 2013 um 13:09 Uhr

Denn wie gesagt in JLS:

Das Ergebnis des Postfix-Ausdrucks muss eine Variable eines Typs sein, der in einen numerischen Typ konvertierbar (§5.1.8) ist, oder es tritt ein Kompilierungsfehler auf.

Benutzer-Avatar
Apurv

getInt() ist nicht int

getInt() kehrt zurück int

++ Betreiber tut zwei Dinge increment + assignment

So für ++ Damit der Operator funktioniert, benötigen Sie eine Variable, um das Ergebnis der Inkrementoperation zu speichern 0 und getInt() beides nicht.

Die Prä- und Post-Operatoren arbeiten nur mit Variablen oder lvalues, wie sie genannt werden. lvalue ist die Abkürzung für left value, also etwas, das in einer Zuweisung links stehen kann. In deinem Beispiel:

    zero = 1; // OK
    0 = 1; // Meaningless
    getInt() = 1; // Also meaningless

//jk

Sowohl B als auch C lassen den Compiler sagen:

unerwarteter Typ, erforderlich: Variable, gefunden: Wert

Sie können also keinen Wert erhöhen, sondern nur eine Variable.

Warum funktioniert der Post-Increment-Operator nicht bei einer Methode, die ein int zurückgibt?

Weil es eine Getter-Methode ist und es keinen Sinn macht, einen Wert über Getter zu ändern.


int z = x + y++;

ist äquivalent zu:

int z = x + y;
y = y + 1;

Es ist also nicht gültig, etwas zu haben wie:

int z = x + getY()++;

was äquivalent ist zu:

int z = x + getY();
getY() = getY() + 1; // invalid!

Benutzer-Avatar
Azodiös

0++

Es ist äquivalent zu 0 = 0 + 1; und sicherlich ist es nicht möglich.

dh es muss sein l-value ihm zuzuordnen.

getInt()++;

Ähnlicher Grund hier.

  • + nette Antwort, was ist ++(i|i) ? Weil i | i stets i Auch i & i==i

    – Grijesh Chauhan

    8. März 2013 um 20:23 Uhr

1093410cookie-checkWarum funktioniert der Post-Increment-Operator nicht bei einer Methode, die ein int zurückgibt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy