在一个陈述中取消引用和推进指针?

时间:2009-07-07 19:31:27

标签: c# operator-precedence unsafe-pointers

我正在从字节数组中读取如下:

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

如果我错了,请纠正我,但++优先于*,那么可以将* i和i ++结合在同一个语句中吗? (例如* i ++)

(这在技术上是不安全的C#,而不是C ++,p是一个字节*)

2 个答案:

答案 0 :(得分: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];
}

显然不等同。

答案 1 :(得分:2)

id = *i++

会做你想做的事。

++在取消引用后修改指针。

编辑: 正如埃里克指出的那样,根据规范,++在取消引用后不会发生。 i ++递增i并返回其初始值,因此规范定义的行为是在取消引用之前发生的增量。无论您在取消引用之前还是之后查看发生的增量,id = * i ++的可见行为都是相同的。