2009-07-07 11 views
1

Ich bin von einem Byte-Array zu lesen wie folgt: * i zu kombinieren und i ++ in derselben AnweisungDereferenzieren und Zeiger in einer Anweisung weiterleiten?

int* i = (int*)p; 
id = *i; 
i++; 

korrigiert mich wenn ich falsch liege, aber ++ Vorrang vor * hat, so möglich ist, ? (Z * i ++)

(dies technisch unsichere C#, nicht C++, p ist ein Byte *)

+4

Ja, aber _ bitte_ nicht tun. Ihr Code ist perfekt zu lesen, zu verstehen, zu modifizieren und zu debuggen. * i ++ ist keines der obigen, denn um zu verstehen, ob es (* i) ++ oder * (i ++) bedeutet, müssen Sie sich an die Vorrangregeln erinnern. –

+0

fair genug, und ich würde zustimmen müssen. nur weil es getan werden kann, bedeutet es nicht, dass es sollte :) – toasteroven

+0

Es ist idiomatisch in C/C++ zu schreiben * i ++, aber es ist definitiv nicht so in C#. –

Antwort

2

Ich glaube, dass

id = *i; 
i++; 

und

id = *i++; 

äquivalent sind.

Der Operator ++ gibt bei Verwendung als Suffix (z. B. i++) den Wert der Variablen vor dem Inkrement zurück.


ich etwas von dem Reflektor Ausgangs verwechselt für

unsafe class Test 
{ 
    static public void Test1(int p, out int id) 
    { 
     int* i = (int*)(p); 
     id = *i; 
     i++; 
    } 

    static public void Test2(int p, out int id) 
    { 
     int* i = (int*)(p); 
     id = *i++; 
    } 
} 

die als

kommt
public static unsafe void Test1(int p, out int id) 
{ 
    int* i = (int*) p; 
    id = i[0]; 
    i++; 
} 

und

public static unsafe void Test2(int p, out int id) 
{ 
    int* i = (int*) p; 
    i++; 
    id = i[0]; 
} 

die eindeutig nicht gleichwertig sind.

2

id = *i++

wird tun, was Sie wollen.

++ modifiziert den Zeiger nach der Dereferenzierung.

EDIT: Wie Eric darauf hinweist, nach der Spezifikation, passiert ++ nicht nach Dereferenzierung. i ++ erhöht i und gibt seinen Anfangswert zurück, so dass das spezifizierte Verhalten das Inkrement vor der Dereferenzierung ist. Das sichtbare Verhalten von id = * i ++ ist dasselbe, unabhängig davon, ob Sie das Inkrement vor oder nach der Dereferenzierung anzeigen.

+0

Eigentlich muss man wirklich vorsichtig sein, wenn man diese Aussage macht. Es ERSCHEINT, dass der Zeiger nach der Dereferenzierung geändert wird, aber das stimmt nicht wirklich! Denken Sie daran, dass "after" impliziert, dass es eine Folge von Ereignissen in der Zeit gibt. Es ist Charakterbildung, um herauszufinden, was genau die zeitliche Abfolge für diesen Fall ist. Wenn Sie dies tun, werden Sie sehen, dass die Änderung der Variablen tatsächlich VOR der Dereferenzierung erfolgt. –

+0

Darüber hinaus gibt MSDN in "Rangfolge und Reihenfolge der Auswertung" explizit an, dass Operatoren mit höherer Priorität vor Operatoren mit niedrigerer Priorität ausgewertet werden. Also hängt die Bewertungsreihenfolge nicht von einer Laune des Compilers, des Optimierers oder einer Operatorüberladung ab, sondern ist streng von der Sprache definiert. Inkrementiere zuerst, dann Dereferenz, aber benutze den alten Zeigerwert. Es wird etwas komplizierter, wenn Sie so etwas tun: a = * i ++ + 2 * * i ++.Dies kann als One-Line-Spaghetti gesehen werden, aber es ist klar definiert :) – Rolf