我从一个字节数组中读取如下:
int* i = (int*)p;
id = *i;
i++;
如果我错了,请纠正我,但 ++ 优先于 *,因此可以在同一语句中组合 *i 和 i++ 吗?(例如 *i++)
(这在技术上是不安全的 C#,而不是 C++,p 是一个字节*)
我从一个字节数组中读取如下:
int* i = (int*)p;
id = *i;
i++;
如果我错了,请纠正我,但 ++ 优先于 *,因此可以在同一语句中组合 *i 和 i++ 吗?(例如 *i++)
(这在技术上是不安全的 C#,而不是 C++,p 是一个字节*)
我相信
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];
}
这显然是不等价的。
id = *i++
会做你想做的。
++ 在取消引用之后修改指针。
编辑:正如 Eric 指出的那样,根据规范,取消引用后不会发生 ++ 。i++ 递增 i 并返回其初始值,因此规范定义的行为是递增发生在取消引用之前。无论您查看在取消引用之前还是之后发生的增量,id = *i++ 的可见行为都是相同的。