Operatoren i=i++; Was passiert hier?

SafeDebagger

Mitglied
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

LG

der hohe SafeDebagger
 

mrBrown

Super-Moderator
Mitarbeiter
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

i++ erhöht erst i um 1, und gibt dann den alten Wert von i zurück, und i wird danach auf diesen Wert gesetzt.

Wenn man das etwas aufdröselt, ist's leichter versändlich:
Java:
int tmp = i;
i = i + 1; // i wird um 1 erhöht
i = tmp; // i wird auf den alten Wert gesetzt


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;
Ich bin mir nicht sicher, ob das irgendwie das richtige meinen könnte, aber das klingt einfach völlig falsch.
 

SafeDebagger

Mitglied
i++ erhöht erst i um 1, und gibt dann den alten Wert von i zurück, und i wird danach auf diesen Wert gesetzt.

Wenn man das etwas aufdröselt, ist's leichter versändlich:
Java:
int tmp = i;
i = i + 1; // i wird um 1 erhöht
i = tmp; // i wird auf den alten Wert gesetzt



Ich bin mir nicht sicher, ob das irgendwie das richtige meinen könnte, aber das klingt einfach völlig falsch.

Macht für mich keinen Sinn
 

httpdigest

Top Contributor
Macht für mich keinen Sinn
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).
 
X

Xyz1

Gast
Frage: Was wird warum hier ausgegeben oder hier nicht ausgegeben werden?
Java:
		int i = 0;
		i = (i = i++);
		++i;
		i = (i = ++i);
		System.out.println(i);

Andere Konstrukte sind leider nicht korrekt. ;)
 

Blender3D

Top Contributor
int tmp = i; i = i + 1; // i wird um 1 erhöht i = tmp; // i wird auf den alten Wert gesetzt
Am besten sieht man die Reihenfolge am Beispiel:
Java:
int i = 1;
i = 1 + i++;
i bekommt eine eigene Adresse im Speicher.
Java:
int tmp = i;
Jetzt erfolgt die Addition dann die Zuweisung
Java:
int i = 1+i
Dann
Code:
tmp++;
Ergebnis = 2
 

mrBrown

Super-Moderator
Mitarbeiter
Am besten sieht man die Reihenfolge am Beispiel:
Java:
int i = 1;
i = 1 + i++;
i bekommt eine eigene Adresse im Speicher.
Java:
int tmp = i;
Jetzt erfolgt die Addition dann die Zuweisung
Java:
int i = 1+i
Dann
Code:
tmp++;
Ergebnis = 2
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.
 

mihe7

Top Contributor
Ich bin mir nicht sicher, ob das irgendwie das richtige meinen könnte, aber das klingt einfach völlig falsch.
Bei der Zuweisung bekommt i eine neue Adresse im Speicher.
int tmp = i;

Der Post Increment Operator erhöht erst nach der Zuweisung das i in der ursprünglichen Adresse von i um 1.
i=i+1;

Diese Speicher wird später aber verworfen. Übrig bleibt i = 1;
i=tmp;

:)
 

Meniskusschaden

Top Contributor
Dieses Programm:
Java:
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
}
 

Blender3D

Top Contributor
Weder passen deine einzelnen Zeilen zu dem Block, noch gibt es da irgendwo eine inkrementierung von 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;
 

mrBrown

Super-Moderator
Mitarbeiter
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;
Ich bezog mich ja auch auf das Inkrementieren von tmp, nicht auf nur tmp :)

Mit tmp (bzw Stack/Register) wird halt nichts gemacht, da landet kurz der Wert von i um danach wieder zurückgeschrieben zu werden.


Edit: Um bei deinem Beispiel zu bleiben:
Java:
int i = 1;
i = 1 + i++;

Ist äquivalent zu:
Java:
int i = 1;
int tmp = i;
i++;
i = 1 + tmp;

Da gibts einfach kein tmp++
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Unklarer Code (was passiert hier?) Java Basics - Anfänger-Themen 1
T boolean, was passiert hier? Java Basics - Anfänger-Themen 4
J Was passiert hier? Java Basics - Anfänger-Themen 6
G Abstrakte Klasse (was passiert hier) Java Basics - Anfänger-Themen 3
T Kann mir jemand wörtlich erklären, was in dem Code genau passiert? Java Basics - Anfänger-Themen 1
N Was Passiert mit dem Namen einer Variable, wenn man diese einer Liste Hinzufügt Java Basics - Anfänger-Themen 16
N Enum Typen, was passiert intern mit ihnen? Java Basics - Anfänger-Themen 2
N Was passiert wenn wir Daten auf der Festplatte abspeichern wollen? bzgl. BufferStreams Java Basics - Anfänger-Themen 9
T Kann mir jemand sagen, was bei folgender for-Schleife passiert? Java Basics - Anfänger-Themen 1
V Was passiert in dem Programm? Java Basics - Anfänger-Themen 3
B Was passiert in dieser Methode? Java Basics - Anfänger-Themen 3
W Was passiert mit Objekten die nicht in Objektvariablen initialisiert werden ? Java Basics - Anfänger-Themen 3
G Was passiert bei einem Overflow von zwei Integer Java Basics - Anfänger-Themen 6
B Nichts passiert... Java Basics - Anfänger-Themen 4
C Klassen BubbleSort was passiert mit dem Index ? Java Basics - Anfänger-Themen 2
D KeyListener, nichts passiert Java Basics - Anfänger-Themen 6
B Was passiert, wenn eine konkrete Klasse von generische Klasse erbt? Java Basics - Anfänger-Themen 14
F festlegen, was beim schließen des fensters passiert Java Basics - Anfänger-Themen 12
E DeSerialize von verändertem Object, was passiert? Java Basics - Anfänger-Themen 4
-horn- Was passiert, wenn Zähler über Integer Max läuft? Java Basics - Anfänger-Themen 9
G Was passiert mit eine Methode bei einer Instanz Java Basics - Anfänger-Themen 13
R Deklaration: was passiert da? Java Basics - Anfänger-Themen 3
G Was passiert "at compile time" Java Basics - Anfänger-Themen 3
M 2 Fragen: Vergleich, aber wie? Was passiert in diesem Teil? Java Basics - Anfänger-Themen 18
G pow(double,double) was passiert bei pow(double,int) Java Basics - Anfänger-Themen 6
M Migration JUnit 3.8 -> 4.0, was passiert mit Testsuites? Java Basics - Anfänger-Themen 3
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
D Ist Ableiten hier sinnvoll Java Basics - Anfänger-Themen 5
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
B Dekorator Muster - Irgendwas stimmt hier doch nicht? Java Basics - Anfänger-Themen 4
frager2345 Warum muss ich hier im Konstruktor meine Exeption nicht abfangen ? Java Basics - Anfänger-Themen 4
D Warum kann ich hier nicht auf die Methode zugreifen? Java Basics - Anfänger-Themen 5
H BlueJ: was genau ist hier der Fehler? Java Basics - Anfänger-Themen 14
J Hallo zusammen , was macht diese Methode hier genau? Java Basics - Anfänger-Themen 3
U Warum kriege ich hier eine nullpointer exception, sehe den Fehler nicht (swing) Java Basics - Anfänger-Themen 1
M Was wird hier genau getestet? Java Basics - Anfänger-Themen 9
M Was habe ich hier falsch, dass wenn ich z.B.: 11 eingebe mir false zurück gegeben wird? Java Basics - Anfänger-Themen 2
M Kann mir jemand hier die Logik vermitteln? Java Basics - Anfänger-Themen 3
M Wie kann ich hier den Abstand ausgeben? Java Basics - Anfänger-Themen 3
S Wie kann ich bei diesem Code erreichen, das als Ergebnis hier 15 herauskommt? Java Basics - Anfänger-Themen 23
P Weswegen entstehen hier Syntaxfehler? Java Basics - Anfänger-Themen 3
J Wie kann ich hier eine While schleife einbauen? Java Basics - Anfänger-Themen 3
A Wieso bekomme ich hier zwei unterschiedliche Ausgaben? Java Basics - Anfänger-Themen 6
S Was für Aufgaben könnten sich hier hinter verbergen? Java Basics - Anfänger-Themen 5
R Warum werden hier nur die grün und orangen Linien ausgegeben und der Rest unten nicht? Java Basics - Anfänger-Themen 5
R Wie würde hier die if-Anweisung aussehen? Java Basics - Anfänger-Themen 18
G Warum ist hier ein Lamda-Ausdruck möglich Java Basics - Anfänger-Themen 2
O Was bedeutet das hier 999_983? Java Basics - Anfänger-Themen 2
F Warum ist die Ausgabe hier 1? Java Basics - Anfänger-Themen 4
P Vererbung Warum funktioniert die Vererbung hier nicht Java Basics - Anfänger-Themen 14
M Wie kann ich hier ein Textfeld hinzufügen Java Swing? Java Basics - Anfänger-Themen 1
L Collections Ist eine Arraylist hier das richtige? Java Basics - Anfänger-Themen 12
R Kann mir hier jemand weiterhelfen? Java Basics - Anfänger-Themen 1
B Wieso wird hier so viel als falsch angezeigt? Java Basics - Anfänger-Themen 2
B Wieso gibt er hier nur die ungeraden Zahlen aus? Java Basics - Anfänger-Themen 5
B Kann mir jemand erklären, warum hier dreimal was ausgegeben wird und nicht nur zweimal? Java Basics - Anfänger-Themen 16
P Compiler-Fehler Wo befindet sich hier der Fehler und warum? Java Basics - Anfänger-Themen 21
K Public Attribute oder getter - funktioniert leider beides hier nicht Java Basics - Anfänger-Themen 5
F Operatoren Wieso fliegt hier eine NullPointer Exception :( Java Basics - Anfänger-Themen 3
K Was wird hier nacheinander gemacht? Java Basics - Anfänger-Themen 1
L [ARRAY] Werden hier die Indezes oder die Werte vergliechen? Java Basics - Anfänger-Themen 4
M Liegt hier bereits ein Bad Smell vor? Java Basics - Anfänger-Themen 9
K Was macht hier genau return? Java Basics - Anfänger-Themen 2
V in diesem Forum wurde mir am meisten geholfen, daher eine Frage die hier nicht passt. sry (VB Frage) Java Basics - Anfänger-Themen 3
O euer chat hier Java Basics - Anfänger-Themen 1
R kann mir jemand erklären was hier gemacht wurde? Java Basics - Anfänger-Themen 10
K Wie übergebe ich hier korrekt die Werte Java Basics - Anfänger-Themen 5
B Warum gibst hier Equals false zurück ? Java Basics - Anfänger-Themen 23
V Warum wird hier 200 ausgeliefert? Java Basics - Anfänger-Themen 39
S Klassen Klasse oder nicht Klasse - das ist hier die Frage Java Basics - Anfänger-Themen 6
W Methoden Wie wird eine Methode hier aufgerufen? Java Basics - Anfänger-Themen 5
S wieso Fehlermeldung cannot find symbol hier Java Basics - Anfänger-Themen 10
K Was ist hier Falsch? Java Basics - Anfänger-Themen 3
L Erste Schritte Sollte ich hier lieber Cases verwenden oder wäre eine If-Bedingung besser? Java Basics - Anfänger-Themen 6
E Kann mir jemand sagen was hier falsch ist? Java Basics - Anfänger-Themen 6
D Wie "unchecked cast" hier vermeiden? Java Basics - Anfänger-Themen 2
R Wieso hänge ich hier in einer Endlosschleife (vermute ich zumindest)? Java Basics - Anfänger-Themen 2
Q switch case hier möglich Java Basics - Anfänger-Themen 10
P Was ist hier falsch? Java Basics - Anfänger-Themen 6
Luk10 Wo zum Teufel fehlen Hier Klammern? Java Basics - Anfänger-Themen 2
T Was mache ich hier falsch? Java Basics - Anfänger-Themen 3
M Was könnte hier nicht stimmen??? Java Basics - Anfänger-Themen 9
K Warum funktioniert hier die setText methode? Java Basics - Anfänger-Themen 3
S Wie ereuge ich hier am besten eine Schleife Java Basics - Anfänger-Themen 12
K Hier noch ein Konstruktor aufbauen Java Basics - Anfänger-Themen 6
G Welche Datenstruktur ist hier die sinnvolste Java Basics - Anfänger-Themen 6
M warum kompiliert das hier nicht? Java Basics - Anfänger-Themen 3
G Probleme mit break hier; in if-Bedingung Java Basics - Anfänger-Themen 5
S Hallo, ich hab hier ein Buch Java Basics - Anfänger-Themen 11
S Warum wirkt hier synchronized nicht? Java Basics - Anfänger-Themen 9
S Funktion hier sinnvoll ? Java Basics - Anfänger-Themen 4
zilti Was ist hier falsch? Java Basics - Anfänger-Themen 13
S Bot Fragen(hoffe das ist hier richtig) Java Basics - Anfänger-Themen 12
D was stimmt hier nicht? Java Basics - Anfänger-Themen 7
W HTML oder nicht? Das ist hier die Frage. Java Basics - Anfänger-Themen 4
K Was ist hier faul? Java Basics - Anfänger-Themen 29
L Was stimmt hier nicht Java Basics - Anfänger-Themen 2
G konkretes beispiel: interface hier besser als abstrakte kl. Java Basics - Anfänger-Themen 4
V Reihenfolge von Befehlen - hier repaint() zu spät Java Basics - Anfänger-Themen 13
G was ist hier falsch? Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben