++operator++ + als Ausdruck im paramater



  • Hallo,

    ich habe code gefunden indem der ++ operator wie folgt verwendet wird:

    int test (int para) {...};
    
    int main(...)
    {
       int idx = 0;
       for (i = 0; i < 100; i++)
       {
           test (idx++);
       }
    }
    

    Ich hätte jetzt erwartet, dass zuerst i++ berechnet wird, da ja bei der Übergabe von parametern sichergestellt ist, dass alle Ausdrücke abgeabeitet sind. In der Realität ist es aber nicht so. Da wird zuerst der parameter übergeben und danach inkrementiert.

    Meine Realität ist übrigens MS VC6



  • mach dir am besten nochmal klar was der unterschied zwischen prefix/postfix ist

    ++idx;
    //oder
    idx++;
    


  • templäd schrieb:

    Ich hätte jetzt erwartet, dass zuerst i++ berechnet wird, da ja bei der Übergabe von parametern sichergestellt ist, dass alle Ausdrücke abgeabeitet sind.

    Genau so ist es auch (unter der Annahme, dass du idx++ meinst, nicht i++, was deine Schleifenvariable wäre).

    Das Ergebnis von idx++ ist aber nunmal der *alte* Wert von idx und dieser wird verwendet um deinen Parameter zu initialisieren.

    Der Code ist also äquivalent zu:

    int main(...)
    {
       int idx = 0;
       for (i = 0; i < 100; i++)
       {
           int oldIdx = idx;
           idx = idx + 1;
           test (oldIdx);
       }
    }
    


  • Hallo,

    Vielleicht halten wir uns noch einmal vor Augen wo der unterschied zwischen der Postfix- und der Präfixversion des Inkrementoperators liegt.

    Inkrementoperator Präfix (Bsp. ++i):
    1. Die Variablen wird inkrementiert (i += 1; )
    2. Die Variablen wird zurückgegeben (return i; )

    Inkrementoperator Postfix (Bsp. i++):
    1. Eine lokale Kopie wird von der Variablen angelegt (int tmp = i; )
    2. Die Variable wird inkrementiert (i += 1; )
    3. Die lokale Kopie wird zurückgeliefert

    Bei dem Fall f(i++) wird also der komplette Ausdruck i++ verarbeitet bevor die Funktion f aufgerufen wird. Hierbei wird wie oben beschrieben vorgegangen: Ein lokales Abbild der Variablen i wird erstellt (int tmp = i; ). Anschließend wird i inkrementiert (i += 1; ) und zuletzt wird die lokale Kopie zurückgegeben (return tmp; ).

    Grüße Martin


Anmelden zum Antworten