Methodenaufruf mit geänderten Argumenten

Cepheus

Mitglied
Ich bitte um eine Erklärung, warum der nachfolgende Code die Ausgabe 1 liefert:
Java:
        int i = 1;
        System.out.println( Math.max( i++, --i ) );        // 1
Danke im Voraus,
Cepheus
 
Die Reihenfolge der Ausführung sind hier wichtig.

++i Hier wird erst i erhöht und dann der Wert genommen.
i-- Hier wird erst der Wert von i genommen und dann i reduziert.

Damit wird da i erst erhöht und dann der Wert genommen (2), dann wird Max von 2 und 1 genommen und ausgegeben. Dann wird i um 1 reduziert.

Da auf dem Smartphone geschrieben hat die Autokorrektur einige i groß gemacht … hier geht es immer um die Variable i


Edit: Bitte die übernächste Antwort anschauen für bessere / richtige Erklärung. Und "i"s korrigiert.
 
Zuletzt bearbeitet:
Erklärung war prinzipiell richtig, aber beim Schreiben hatte ich das falsch herum im Kopf. Der Pre Operator ist das — also wird da I reduziert und die 0 genommen. Es geht also um max(1,0) was 1 ist.

Edit: Bitte die folgende Antwort anschauen für bessere / richtige Erklärung.
 
Zuletzt bearbeitet:
Ok, jetzt doch noch einmal schnell an den Rechner - die Frage ist sonst doch zu oberflächig oder gar falsch beantwortet. Was haben wir hier?

Wir haben einen Methodenaufruf: Math.max( Param1, Param2)
Bei einem Methodenaufruf werden die Parameter von Links nach Rechts ausgewertet. Also hier erst Param1 und dann Param2

Param1 ist i++, d.h. es wird erst der Wert von i genommen. Dann wird i erhöht. Nach Auswerten des ersten Parameters ist i dann 2.
Param2 ist --i, hier wird erst der Wert von i um 1 reduziert und dann wird der Wert von i genommen. Damit wird hier auch wieder 1 genommen und i ist danach 1.

Sorry, für mögliche Verwirrung durch erste überschnelle Antworten auf dem Smartphone. Kurz vor dem ins Bett gehen sollte ich nichts auf dem Smartphone schreiben ... zumindest nicht ohne richtig nachzudenken.
 
Evtl. etwas Code zum spielen um dies etwas besser auszuprobieren:

Java:
    static void print(int... values) {
        for (int value : values)
            System.out.println(value);
    }

Da kannst Du dann die Auswertung der Parameter relativ gut beobachten. Also z.B. mit einem Aufruf von
Java:
        int i = 1;
        print(i++, i, --i);

Das zeigt dann halt:
  • Was wird bei i++ am Ende übergeben?
  • Was ist i nach der Auswertung des ersten Parameters?
  • Was wird dann bei --1 übergeben?

Da erkennt man dann relativ gut, dass erst der Parameter i++ ausgewertet wird. Da i 1 war, wird 1 als Parameter übergeben und danach ist i == 2. Daher ist der zweite Parameter 2. Beim dritten Parameter wird i erst reduziert und dann der Wert übergeben. Der ist dann wieder 1.
Die Ausgabe ist dann also
1
2
1

Das evtl. einfach um einmal damit etwas zu spielen.
 
Das erste Argument bekommt 1, das zweite Argument bekommt 0. Das Max von 0 und 1 ist 1. Die Post-Inkrementierung erfolgt erst nach dem Max-Methodenaufruf.
Sorry, ich hatte, ähnlich wie Konrad, gerade voll daneben gehauen:

Java:
    public static void main(final String[] args) {
        System.out.println("Hello world !!!");
        int i = 1;
        print(i++, --i);
    }

    public static void print(int a, int b) {
        System.out.println(a + "  " + b);
    }

Die Ausgabe ist 1 und 1. Die Auswertung der Argumente erfolgt von links nach rechts.
 
So würde es noch einmal deutlicher werden:

Java:
    public static void main(final String[] args) {
        System.out.println("Hello world !!!");
        int i = 1;
        print(i++, i, --i);
    }

    public static void print(int a, int c, int b) {
        System.out.println(a + "  " + c + "  " + b);
    }

***

Bitte aber auch daran danken, dass man das in der Praxis so nicht machen würde.
 

Zurück
Oben