Was ist der Unterschied zwischen *y++
und ++*y
?
Die Bedeutung eines Ausdrucks in C wird durch zwei Dinge aus: was Wert es produziert und welche Nebenwirkungen es produziert.
Lassen Sie uns den ersten Ausdruck untersuchen.
Postfix-Inkrement hat eine höhere Priorität als Dereferenzierung, also ist dies *(y++)
.
Das Postfixinkrement erzeugt einen Nebeneffekt: Es ändert den Wert y
, um auf einen anderen Ort zu zeigen. Das Postfixinkrement erzeugt auch einen Wert: den Wert, den y
hatte, bevor er inkrementiert wurde. Der Operator *
dereferenziert dann diesen Wert, um einen Lvalue zu erzeugen: das heißt, etwas, das Sie als Variable verwenden können, um entweder zu speichern oder von ihm abzurufen.
Ich bemerke, dass der Nebeneffekt an jedem Punkt vor oder nach der Dereferenzierung auftreten kann. Wenn Sie
sagen
q = *y++
dann die Nebenwirkung der ++
an irgendeiner Stelle passieren könnte. Dies könnte:
q = *y;
y = y + 1;
oder es könnte als
t = y;
y = y + 1;
q = *t;
Beide sind vollkommen legal behandelt werden. (Außer natürlich, dass, wenn y
selbst ein Ausdruck mit Nebenwirkungen ist, diese Nebenwirkungen nur einmal produziert werden müssen. Zur Klarheit werde ich diese Annahme durchweg machen.)
Wie wäre es mit ++*y
? Das ist einfach: *y
erzeugt eine Variable, der Inhalt der Variablen wird inkrementiert und der Wert des Ausdrucks ist der inkrementierte Wert. Beachten Sie, dass auch hier kann die Nebenwirkung hergestellt werden out-of-order:
q = ++*y
wie behandelt werden könnten:
t = *y + 1;
*y = t;
q = t;
oder als
t = *y + 1;
q = t;
*y = t;
Denken Sie daran, C nicht produzieren sehr viele Einschränkungen in der Reihenfolge, in denen Nebenwirkungen auftreten können, so sei vorsichtig.
Denken Sie an '++ * y' und' * ++ y'. –
Ich sehe Sie haben mit Zeigern zu tun, aber das könnte helfen: http://StackOverflow.com/Questions/1094872/is-there-a-difference-between-x-and-x-in-java – zztops
Können Sie nicht nur * run * das Programm seine Ausgabe finden? (Nun, wenn Sie es beheben, um nicht undefiniertes Verhalten zuerst zu haben ...) –