dereference ومؤشر مسبق في بيان واحد؟
-
11-09-2019 - |
سؤال
أنا أقرأ من صفيف بايت على النحو التالي:
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++
سوف تفعل ما تريد.
++ يعدل المؤشر بعد dereference.
تحرير: كما يشير إريك، لكل المواصفات، ++ لا يحدث بعد dereference. i ++ الزيادات الأولى وأعترب قيمتها الأولية، لذلك السلوك المحدد للمؤسسات هو الزيادة يحدث قبل إلغاء الإصلاح. السلوك المرئي للمعرف = * i ++ هو نفسه ما إذا كنت تعرض الزيادة التي تحدث قبل أو بعد dereference.