عند استخدام حلقة 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 هي كالتالي:
lessfor (range_declaration : range_expression) {
// تنفيذ الكود هنا
}
حيث:
range_declaration
هي المتغير الذي يتم استخدامه لتخزين كل عنصر في النطاق أثناء كل تكرار.range_expression
هي التعبير الذي يمثل النطاق الذي يتم تكرار عناصره.
وفي حالتك، كما ذكرت، كنت تتوقع أن يتم تعديل المتغير last
بقيمة العنصر الأخير في النطاق بعد انتهاء الحلقة، ولكن GCC تتصرف بشكل مختلف. يبدو أن GCC يقوم بتعريف متغير مؤقت داخل حلقة الـ range-based for loop، ولا يؤثر على المتغير الأصلي الذي تم تعريفه خارج الحلقة.
لحل هذه المشكلة والحصول على السلوك المتوقع، يمكنك استخدام حلقة for التقليدية وتحديث المتغير last
يدويًا، أو استخدام المتغير المؤقت داخل حلقة الـ range-based for loop وتحديث المتغير last
بعد الحلقة.