Warum funktioniert der Post-Increment-Operator nicht bei einer Methode, die ein int zurückgibt?
Lesezeit: 4 Minuten
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
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 🙂
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.
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
Eine Randbemerkung: So wie Sie Ihre Variablen benannt haben, scheinen Sie davon auszugehen
int oneA = zero++;
weist zu eines zuoneA
. Das ist falsch. Das Post Inkrement-Operator gibt die zurück alt (nicht inkrementierter) Wert. Nachint oneA = zero++;
,oneA
ist0
undzero
ist1
.– 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