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 33Nun, dachte ich, wenn der Postinkrement geht, muss der Präinkrement ja auch gehen.
Ich probierteint zahlen[4] = {11, 22, 33, 44}; zeiger = zahlen; cout << *zeiger++ << endl; cout << *zeiger++ << endl; cout << ++*zeiger << endl;und erwartete als Ausgabe:
11 22 44stattdessen 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 vonzahlen[3].
Also wennint zahlen[4] = {11, 22, 16, 27};kommt als Ergebnis:
11 22 17Kann 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!
-
++*zeigererhö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.
-
_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 vonoperator*()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.