Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Grüzi an die Informatik Community!
Laut Schulbuch führt i = i++; zu keiner Veränderung von i. Das würde ich akzeptieren, wenn ich es verstehen kann. Bitte um Aufklärung
Bei der Zuweisung bekommt i eine neue Adresse im Speicher.
Der Post Increment Operator erhöht erst nach der Zuweisung das i in der ursprünglichen Adresse von i um 1.
Diese Speicher wird später aber verworfen. Übrig bleibt i = 1;
Bei der Zuweisung bekommt i eine neue Adresse im Speicher.
Der Post Increment Operator erhöht erst nach der Zuweisung das i in der ursprünglichen Adresse von i um 1.
Diese Speicher wird später aber verworfen. Übrig bleibt i = 1;
Ist aber dennoch die richtige Antwort. Der Ausdruck `i++` bedeutet: "Lese den Wert von i und 'merke' ihn dir. Anschließend inkrementiere die Variable `i`. Das 'Merken' findet in der Praxis in einem Prozessor-Register statt. Das Ergebnis des Ausdrucks `i++`, also der Wert, den dieser Ausdruck "generiert" für weitere nachfolgende Operatoren in dem Gesamtausdruck, ist aber der aktuelle Wert von `i` vor der Inkrementierung. Danach wird `i` inkrementiert, das beeinflusst aber nicht mehr, welcher Wert für weitere Operatoren verwendet wird.
Der "Pseudo-Code" von mrBrown:
Java:
int tmp = i;
i = i + 1; // i wird um 1 erhöht
i = tmp; // i wird auf den alten Wert gesetzt
ist exakt, was tatsächlich passiert. Nur dass eben die künstliche Variable `tmp` einfach ein Register ist (also keine lokale Variable im Sinne der JVM).
Das ist zu knapp formuliert und auch falsch, weil unklar ist, was du genau mit "Änderung von i" meinst. `i` wird eben nicht nach, sondern vor der Zuweisung an `i` inkrementiert.
Das ist zu knapp formuliert und auch falsch, weil unklar ist, was du genau mit "Änderung von i" meinst. `i` wird eben nicht nach, sondern vor der Zuweisung an `i` inkrementiert.
Ich habe ganz ehrlich keine Ahnung, was du damit sagen willst. Weder passen deine einzelnen Zeilen zu dem Block, noch gibt es da irgendwo eine inkrementierung von tmp.
Das Ergebnis von i=i++ hat nichts mit irgendwelchen Speicheradressen zu tun, sondern ist einfach nur das definierte Verhalten und völlig ohne irgendeinen Speicher erklärbar.
package increment;
public class Increment {
public static void main(String[] args) {
int i;
i=8;
i=i++;
}
}
führt zu folgendem Bytecode (siehe kommentierte Zeilen):
Code:
// Compiled from Increment.java (version 10 : 54.0, super bit)
public class increment.Increment {
// Method descriptor #6 ()V
// Stack: 1, Locals: 1
public Increment();
0 aload_0 [this]
1 invokespecial java.lang.Object() [8]
4 return
Line numbers:
[pc: 0, line: 3]
Local variable table:
[pc: 0, pc: 5] local: this index: 0 type: increment.Increment
// Method descriptor #15 ([Ljava/lang/String;)V
// Stack: 1, Locals: 2
public static void main(java.lang.String[] args);
0 bipush 8 // 8 wird auf den Stack gelegt
2 istore_1 [i] // 8 wird vom Stack entfernt und in Variable i gespeichert
3 iload_1 [i] // 8 wird aus Variable i gelesen und auf Stack gelegt
4 iinc 1 1 [i] // Variable i wird inkrementiert und enthält jetzt 9
7 istore_1 [i] // 8 wird vom Stack entfernt und in Variable i gespeichert. i enthält wieder 8.
8 return
Line numbers:
[pc: 0, line: 7]
[pc: 3, line: 8]
[pc: 8, line: 9]
Local variable table:
[pc: 0, pc: 9] local: args index: 0 type: java.lang.String[]
[pc: 3, pc: 9] local: i index: 1 type: int
}
Die Variable tmp habe ich nur von Dir übernommen, um den Zwischenspeicher zu verdeutlichen. (War Deine Idee)
Genauer erklärt wird das ganze von @Meniskusschaden
3 iload_1 // 8 wird aus Variable i gelesen und auf Stack gelegt: : tmp = i;
4 iinc 1 1 // Variable i wird inkrementiert und enthält jetzt 9 : i++;
7 istore_1 // 8 wird vom Stack entfernt und in Variable i gespeichert. i enthält wieder 8. i = tmp;
Die Variable tmp habe ich nur von Dir übernommen, um den Zwischenspeicher zu verdeutlichen. (War Deine Idee)
Genauer erklärt wird das ganze von @Meniskusschaden
3 iload_1 // 8 wird aus Variable i gelesen und auf Stack gelegt: : tmp = i;
4 iinc 1 1 // Variable i wird inkrementiert und enthält jetzt 9 : i++;
7 istore_1 // 8 wird vom Stack entfernt und in Variable i gespeichert. i enthält wieder 8. i = tmp;