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 回答