Eine Zeichenkette in C kopieren

7

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%     
chrisgoyal 09.02.2010, 04:03
quelle

7 Antworten

14
%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.

%Vor%

Es gibt nur einen Operator neben s. Daher wird ++ zuerst angewendet und auf dieses Ergebnis wird * angewendet, was zu dem ++ Fehler führt.

%Vor%

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.

    
codaddict 09.02.2010, 04:09
quelle
4

Sie haben Recht. * s = * t wird zuerst gemacht und dann werden sie inkrementiert.

    
Aryabhatta 09.02.2010 04:05
quelle
2

Das Inkrement ist ein Post-Inkrement. Post nicht nur, weil es nach der Inkrementierung der Variablen kommt, sondern auch, weil es nach der Auswertung des Ausdrucks kommt. Die Reihenfolge der Ausführung ist also

%Vor%

dann s ++ und t ++

    
Doug T. 09.02.2010 04:05
quelle
1

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.

    
AraK 09.02.2010 04:05
quelle
0

In Post wird die Inkrementierungsoperationsvariable zuerst verwendet und dann, nachdem sie geändert wurde.

    
Ashish 09.02.2010 04:07
quelle
0

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.

    
DigitalRoss 09.02.2010 04:12
quelle
0

Der Code: (while *s++ = *t++); entspricht ungefähr:

%Vor%

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).

    
Jerry Coffin 09.02.2010 05:22
quelle