2009-07-07 42 views
1

我是從一個字節數組內容如下:解除引用和提前指針在一個語句中?

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

糾正我,如果我錯了,但++擁有*優先級,這樣可以將*我結合我在同一個語句++ ? (例如* I ++)

(這在技術上是不安全的C#,而不是C++,p是一個字節*)

+4

是的,但_please_不。您的代碼非常易於閱讀,理解,修改和調試。 * i ++不是上述內容,因爲爲了理解它是否意味着(* i)++或*(i ++),您需要正確記住優先規則。 – 2009-07-07 19:49:23

+0

夠公平的,我不得不同意。只是因爲它可以完成,並不意味着它應該:) – toasteroven 2009-07-07 19:52:22

回答

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]; 
} 

這顯然是不等價的。

2

id = *i++

會做你想要什麼。

++在取消引用後修改指針。

編輯: 正如Eric所指出的,根據規範,++在解引用後不會發生。 i ++增加i並返回其初始值,因此規範定義的行爲是在取消引用之前發生的增量。無論您是在解除引用之前還是之後查看增量,id = * i ++的可見行爲都是相同的。