我是從一個字節數組內容如下:解除引用和提前指針在一個語句中?
int* i = (int*)p;
id = *i;
i++;
糾正我,如果我錯了,但++擁有*優先級,這樣可以將*我結合我在同一個語句++ ? (例如* I ++)
(這在技術上是不安全的C#,而不是C++,p是一個字節*)
我是從一個字節數組內容如下:解除引用和提前指針在一個語句中?
int* i = (int*)p;
id = *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 ++的可見行爲都是相同的。
是的,但_please_不。您的代碼非常易於閱讀,理解,修改和調試。 * i ++不是上述內容,因爲爲了理解它是否意味着(* i)++或*(i ++),您需要正確記住優先規則。 – 2009-07-07 19:49:23
夠公平的,我不得不同意。只是因爲它可以完成,並不意味着它應該:) – toasteroven 2009-07-07 19:52:22