我正在从字节数组中读取如下:
int* i = (int*)p;
id = *i;
i++;
如果我错了,请纠正我,但++优先于*,那么可以将* i和i ++结合在同一个语句中吗? (例如* i ++)
(这在技术上是不安全的C#,而不是C ++,p是一个字节*)
答案 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 ++的可见行为都是相同的。