Unerklärliches Zeigerverhalten bei Inkrement



  • Hallo!

    Ich bin neu im C++-Bereich, habe aber schon einige Erfahrung mit anderen Programmiersprachen.
    Habe also heute ein bisschen mit den für mich neuen Zeigern und Arrays rumgespielt, und bekomme dabei ein Ergebnis, dass ich nicht verstehen kann.

    Zunächst probierte ich

    int zahlen[4] = {11, 22, 33, 44};
    zeiger = zahlen;
    cout << *zeiger++ << endl;
    cout << *zeiger++ << endl;
    cout << *zeiger << endl;
    

    und bekam das erwartete Ergebnis:

    11
    22
    33
    

    Nun, dachte ich, wenn der Postinkrement geht, muss der Präinkrement ja auch gehen.
    Ich probierte

    int zahlen[4] = {11, 22, 33, 44};
    zeiger = zahlen;
    cout << *zeiger++ << endl;
    cout << *zeiger++ << endl;
    cout << ++*zeiger << endl;
    

    und erwartete als Ausgabe:

    11
    22
    44
    

    stattdessen kam aber:

    11
    22
    [b]34[/b]
    

    Ich habe natürlich noch herausgefunden, wie ich auf das erwartete Ergebnis komme, nämlich indem der Inkrement erst nach dem Stern kommt

    cout << *++zeiger << endl;
    

    Aber dennoch interessiert mich, wie C++ auf die 34 kommt? Was läuft da intern ab? Als Ergebnis kommt die erste Ziffer von zahlen[2] und die letzte Ziffer von zahlen[3] .
    Also wenn

    int zahlen[4] = {11, 22, 16, 27};
    

    kommt als Ergebnis:

    11
    22
    17
    

    Kann mir jemand dieses für mich unverständliche Verhalten des Compilers erklären? Ich weiß, dass es wahrscheinlich kaum praktische Relevanz haben wird, aber ich würde den lieben Compiler gerne verstehen ;).

    Ich nutze cygwin 1.7.5-1 mit NetBeans 6.9.1 unter Windows.

    Würde mich über eine Antwort freuen!



  • ++*zeiger
    

    erhöht halt das, worauf der Zeiger zeigt - in dem Fall die 33. 33 + 1 ist 34, also kriegst du 34.



  • Verdammt bin ich dumm, natürlich!
    Danke.



  • Hier hilft immer ein Blick in die operator precedence.


  • Administrator

    _matze schrieb:

    Hier hilft immer ein Blick in die operator precedence.

    Wenn mich nicht alles täuscht, hat das gar nichts mit der Operatorpriorität zu tun. operator++() wird einfach nur auf dem Rückgabewert von operator*() angewendet. Man könnte es auch folgendermasen umschreiben:

    operator++(operator*(zeiger))
    

    Die Priorität ist erst wichtig, wenn du vorne und hinten einen Operator anwendest.

    Grüssli



  • Genau, die Priorität ist erst wichtig, wenn es mehr als eine Möglichkeit gibt, einen Ausdruck aufzulösen. Hier gibts aber nur eine.


Anmelden zum Antworten