"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا يؤدي تعيين عنصر الخريطة في C++ إلى حجم غير متوقع؟

لماذا يؤدي تعيين عنصر الخريطة في C++ إلى حجم غير متوقع؟

تم النشر بتاريخ 2024-11-04
تصفح:722

 Why Does Assigning to a Map Element in C   Result in an Unexpected Size?

ترتيب تقييم بيانات التعيين في لغة C

يمكن الحصول على مخرجات محيرة عند تعيين قيمة لخريطة:

map mp;
printf("%d ", mp.size());
mp[10] = mp.size();
printf("%d\n", mp[10]);

يطبع هذا الرمز:

0 1

قد تبدو هذه النتيجة غير بديهية، كما قد يتوقع المرء حجم الخريطة هو 1 بعد التعيين. ومع ذلك، فإن ترتيب تقييم بيان المهمة يلعب دورًا حاسمًا هنا.

يقوم الجانب الأيسر من المهمة mp[10] بإرجاع إشارة إلى القيمة الأساسية لعنصر الخريطة. في نفس الوقت، يقوم هذا الإجراء بإنشاء قيمة جديدة للعنصر mp[10]. فقط بعد هذه العملية يتم تقييم الجانب الأيمن، باستخدام الحجم المحسوب حديثًا للخريطة.

لم يتم ذكر هذا السلوك صراحةً في معيار C ولكنه يقع ضمن سلوك غير محدد. يهدف اقتراح حديث، N4228، إلى تحسين ترتيب قواعد التقييم لتحديد مثل هذه الحالات.

ينص القسم ذو الصلة من مشروع معيار C 11 (1.9) على أن تقييمات التعبيرات الفرعية للتعبيرات الفردية غير متسلسلة بشكل عام. ومع ذلك، يتم تسلسل استدعاءات الوظائف (مثل عامل التشغيل [] وsize()) قبل تنفيذ نص الوظيفة المطلوبة.

لذلك، يتم تسلسل المعامل الأيمن لتعبير المهمة بعد المعامل الأيسر، مما يؤدي إلى السلوك الملاحظ. وهذا يعني أن ترتيب التقييم هو كما يلي:

  1. تقييم المعامل الأيمن: mp.size()
  2. إنشاء قيمة المعامل الأيسر: mp[10]
  3. تعيين قيمة المعامل الأيمن إلى المعامل الأيسر

من المتوقع أن يحدد تحديث لمعيار C هذا السلوك، مما يوضح أن المعامل الأيمن لتعبير المهمة متسلسل قبل المعامل الأيسر.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3