• Hallo Leute,

    ich hab hier mal ein interessantes Problem zum Postinkrement wie ich finde. Gleich zu Anfang: Ja, ich weiß der Code unten ist weder hübsch noch sinnvoll ^^. Aber es geht hier mehr ums Verständnis wann der Postinkrement-Operator "aktiv" wird.

    Unten der Code gibt aus (bevor lange geraten wird): 9

    Also ist meine Sicht der Dinge:

    • Auf die Variable c wird erst mal 0 addiert, weil der Postinkrement Operator zunächst den Zugriff auf die Variable abwartet.
    • Während dem Vergleich ist c offensichtlich auch noch nicht inkrementiert worden, da ==1 mit false angegeben wird. Deshalb wird 9+c zurückgegeben.
    • Da die Position 9 im Array ausgelesen wurde, wurde auch zu diesem Zeitpunkt noch nicht inkrementiert.
    • Jetzt findet die Zuweisung statt und c ist und bleibt 9. Wo hat jetzt die Inkrementierung stattgefunden?

    Welche Zeichen im Code dienen Java als Signal dafür, dass inkrementiert werden sollte?

    Code
    public class TEST {
        public static void main(String[] args) {
            int[] a = {0,1,2,3,4,5,6,7,8,9,10};
            int c = 0;
            c = a[ ((c += c++)==1 ? 5+c:9+c) ];
            System.out.println(c);
        }
    }
  • Edit: Die Erklärung ist teilweise falsch. Siehe nächstes Posting.
    -----------------

    servus,

    bei c++ wird c erst im nächsten schritt inkrementiert. bei ++c wird c erst inkrementiert und erst dann weiterverarbeitet.

    dein beispiel kann man folgendermaßen umschreiben:

    bei zeile 6 ist c in der if schleife c=c+c, c=0+0=0
    bei zeile 9 wurde c schon durch die anweisung c++ inkrementiert. c ist nun 1.
    c=a[9+1]=a[10], a[10]=9
    c=9.

    ersetzt du

    PHP
    c = a[ ((c += c++)==1 ? 5+c:9+c) ];


    durch

    PHP
    c = a[ ((c +=++c)==1 ? 5+c:9+c) ];


    sieht das ganze anders aus.

    PHP
    c=0;
    c=c+1;
    c=c+c;

    Otto: Apes don't read philosophy. - Wanda: Yes they do, Otto, they just don't understand
    Beleidigungen sind Argumente jener, die über keine Argumente verfügen.
    «Signanz braucht keine Worte.» | «Signanz gibts nur im Traum.» 

    Das neue MTB-Projekt (PO, Wiki, Mitschriften, Ausarbeitungen, Folien, ...) ist online
    http://mtb-projekt.at

    Einmal editiert, zuletzt von Wings-of-Glory (17. Dezember 2010 um 12:44)

  • Wings-of-Glory, du hast übersehen, dass sein Array mit 0 anfängt, d.h. a[9] = 9.

    Hab den Code auf das Nötigste reduziert und in Java ausprobiert. Ergebnis:
    Wenn eine Variable sich selbst zugewiesen wird, findet das Postinkrement gar nicht statt:

    PHP
    int c = 0;
     c += c++;
     System.out.println(c);  //Ausgabe: 0

    Hier wird das Postinkrement ausgeführt, weil die Variable, die inkrementiert wird, einer anderen Variable zugewiesen wird:

    PHP
    int c = 0;
     int b = 0;
     b += c++;
     System.out.println(b);  //Ausgabe: 0
     System.out.println(c);  //Ausgabe: 1
  • Urks, ja.
    Hm. Interessant, man lernt nie aus.

    Otto: Apes don't read philosophy. - Wanda: Yes they do, Otto, they just don't understand
    Beleidigungen sind Argumente jener, die über keine Argumente verfügen.
    «Signanz braucht keine Worte.» | «Signanz gibts nur im Traum.» 

    Das neue MTB-Projekt (PO, Wiki, Mitschriften, Ausarbeitungen, Folien, ...) ist online
    http://mtb-projekt.at

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!