سؤال

أنا أقرأ من صفيف بايت على النحو التالي:

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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top