البرمجة

تحليل حلقة for القائمة على النطاق في C++11

عند استخدام حلقة for القائمة على النطاق في C++11 مع متغير موجود، من المتوقع أن يتم ملء هذا المتغير بقيمة آخر تكرار بعد الحلقة. ومع ذلك، لقد حصلت على نتائج مختلفة عندما قمت بالاختبار.

على سبيل المثال، في بيئة MSVC 2013، يبدو أنها لا تدعم حلقات for القائمة على النطاق بدون تعريف نوع.

أما بالنسبة لـ GCC-5.1، فإنه يقوم إما بإدخال متغير جديد تلقائيًا أو يعيد تعيينه إلى القيمة الابتدائية، مما يؤدي إلى:

diff
:2 :43 :99 -50

أعتقد أن MSVC تعمل كما تعودنا منها، ولكن ما الذي يحدث مع GCC هنا؟ لماذا لا يكون last هو 99 في السطر الأخير؟

وفقًا لـ تعريف اللغة، أتوقع السلوك الذي وصفته في الجملة الأولى.

markdown
{ auto && __range = range_expression ; for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin) { range_declaration = *__begin; loop_statement } }

range_declaration هو last وليس int last، وبالتالي يجب أن يعدل المتغير الموجود.

المزيد من المعلومات

بالطبع! في لغة C++11، حلقة الـ range-based for loop تُستخدم لتكرار عناصر النطاق، مثل العناصر في مصفوفة أو سلسلة. الصيغة العامة لحلقة الـ range-based for loop هي كالتالي:

less
for (range_declaration : range_expression) { // تنفيذ الكود هنا }

حيث:

  • range_declaration هي المتغير الذي يتم استخدامه لتخزين كل عنصر في النطاق أثناء كل تكرار.
  • range_expression هي التعبير الذي يمثل النطاق الذي يتم تكرار عناصره.

وفي حالتك، كما ذكرت، كنت تتوقع أن يتم تعديل المتغير last بقيمة العنصر الأخير في النطاق بعد انتهاء الحلقة، ولكن GCC تتصرف بشكل مختلف. يبدو أن GCC يقوم بتعريف متغير مؤقت داخل حلقة الـ range-based for loop، ولا يؤثر على المتغير الأصلي الذي تم تعريفه خارج الحلقة.

لحل هذه المشكلة والحصول على السلوك المتوقع، يمكنك استخدام حلقة for التقليدية وتحديث المتغير last يدويًا، أو استخدام المتغير المؤقت داخل حلقة الـ range-based for loop وتحديث المتغير last بعد الحلقة.

زر الذهاب إلى الأعلى