1

次のようにバイト配列から読み取っています。

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

間違っている場合は訂正してください。ただし、++ は * よりも優先されるため、同じステートメントで *i と i++ を組み合わせることができますか? (例: *i++)

(これは技術的に安全でない C# であり、C++ ではありません。p はバイトです*)

4

2 に答える 2

2

私は信じている

id = *i;
i++;

id = *i++;

同等です。

++演算子をサフィックスとして使用すると (例: ) i++、インクリメント前の変数の値が返されます。


のリフレクター出力に多少混乱しています

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++;
    }
}

として出てくる

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

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

明らかに同等ではありません。

于 2009-07-07T19:36:13.670 に答える
2

id = *i++

あなたが望むことをします。

++ は、逆参照後にポインターを変更します。

編集: Eric が指摘するように、仕様によると、逆参照後に ++ は発生しません。i++ は i をインクリメントしてその初期値を返すため、仕様で定義されている動作は、逆参照の前にインクリメントが発生することです。id = *i++ の目に見える動作は、参照解除の前または後に発生するインクリメントを表示しても同じです。

于 2009-07-07T19:36:15.747 に答える