Ich bin verwirrt über diesen Code: ( Ссылка )
%Vor%Was ist die Reihenfolge der Ausführung? Ist * s = * t zuerst getan, und sind sie dann jeweils inkrementiert? Oder andersherum?
Danke.
EDIT: Und wenn es wäre:
%Vor%und
%Vor% In der Prioritätstabelle können Sie deutlich sehen, dass ++
eine höhere Priorität als% hat. Code%. Aber *
wird hier als Post-Inkrement-Operator verwendet, daher erfolgt die Inkrementierung nach dem Zuweisungsausdruck. Also ++
passiert zuerst, dann werden s und t inkrementiert.
BEARBEITEN:
%Vor% Ist das Gleiche wie oben. Sie machen es expliziter mit der Verwendung von Klammern. Aber denken Sie daran, *s = *t
ist immer noch ein Post-Inkrement.
Es gibt nur einen Operator neben s. Daher wird ++
zuerst angewendet und auf dieses Ergebnis wird *
angewendet, was zu dem ++
Fehler führt.
Wieder nur Operator neben s, t. Die Inkrementierung erfolgt also zuerst, gefolgt von der Kopie. Also überspringen wir effektiv die Kopie des ersten Zeichens von t nach s.
Sie haben Recht. * s = * t wird zuerst gemacht und dann werden sie inkrementiert.
BEARBEITEN ::
@chrisgoyal
Reihenfolge der Ausführung ist ein mehrdeutiger Begriff. Es gibt zwei verschiedene Dinge hier. Die syntaktische Ordnung und die Semantik des Ausdrucks.
Syntaktisch wird der Operator ++ zuerst angewendet. Wenn das * s zuerst angewendet wird, entspricht das Folgende dem, was @Hogan sagte:
%Vor%Was sehr ist, unterscheidet sich von Joels Beispiel.
Die Semantik des Operators ++ ist, dass er nach dem Ausdruck ausgeführt wird.
Ich hoffe, dass klarstellt, was ich Fleisch.
Tatsächlich werden s++
und t++
zuerst angewendet. Vergessen Sie nicht, dass der post-fix-Operator ausgeführt wird, nachdem der Ausdruck abgeschlossen ist. Grundsätzlich wird der Operator ++
für beide angewendet, dann *s = *t
wird ausgeführt.
Es gibt also zwei Arten von Inkrementen
%Vor%Und das Ergebnis davon kann dereferenziert werden:
%Vor%Das funktionierte auf einer der allerersten Maschinen, auf denen C lief, sehr gut, dem PDP-11, der einen registerindirekten Adressierungsmodus hatte, der das Register danach inkrementiert. Die folgenden Ops waren in Hardware verfügbar:
%Vor%Sie könnten entweder
tun %Vor%Und wenn Sie das taten, geschah die ganze Zeile in einer einzigen Anweisung. Seit // Kommentare von C99 eingeführt wurden, konnte ich meine Kommentarsyntax nicht durchgehen.
Der Code: (while *s++ = *t++);
entspricht ungefähr:
Der zweite ist genau der gleiche - die zusätzlichen Parens ändern nichts (in diesem Fall). Damit die Parens alles tun können, müssen sie wie folgt aussehen: while ((*s)++ = (*t)++);
. Dies entspricht in etwa Ihrem dritten Beispiel (siehe unten).
Das letzte Beispiel: while(++*s = ++*t);
ist komplett anders. Da die Dereferenz ( *
) näher am Operanden liegt, wird der Operand dereferenziert und das Ergebnis der Dereferenzierung inkrementiert, was bedeutet, dass er den Wert, auf den der Zeiger zeigt, inkrementiert, anstatt den Zeiger selbst zu inkrementieren. Als Ergebnis würde dies das erste Zeichen kopieren, dann dieses Zeichen inkrementieren, dann prüfen, ob dieses Zeichen nicht Null war, und dasselbe fortsetzen, bis es Null war. Das Ergebnis wäre, dass sowohl die Quelle als auch das Ziel zu leeren Strings werden (da das erste Zeichen von beiden jetzt eine Null wäre, die zum Beenden von Strings verwendet wird).
Tags und Links string c pointers pointer-arithmetic