هل i+= ++ أنا سلوك غير محدد في C ++ 0x؟
-
30-09-2019 - |
سؤال
أنا مقتنع جدًا بالتفسير الذي وجدته قال ذلك i = ++i
غير محدد بقدر ما يتعلق الأمر C ++ 0x ، لكنني غير قادر على الحكم على ما إذا كان سلوك i += ++i
محدد جيدًا أم لا. أي من الأشخاص يود ذلك؟
المحلول
المنطق الذي يجعل i = ++i
يمكن استخدام المعالم بشكل جيد لإثبات ذلك i += ++i
يجب أن تكون محددة بشكل جيد.
i += ++i
يعادل i += (i += 1)
وتتطلب قواعد التسلسل الجديدة أن تتم المهمة قبل انتشار قيمة i += 1
التعبير الفرعي.
هذا يعني أن نتيجة التعبير i += ++i
يجب أن يكون هو نفسه i = 2 * i + 1
.
يحرر: لا بد لي من مراجعة إجابتي ، لأن السلوك غير محدد بعد كل شيء.
سلوك i += ++i
غير محدد ، لأن حسابات قيمة التعبير الفرعي i
(حجة الجانب الأيسر) و ++i
لا تسرد فيما يتعلق ببعضها البعض ويحتوي أحدهم على تحديث للكائن i
.
هذه ليست مشكلة للتعبير i = ++i
, ، لأن هناك i
على الجانب الأيسر لا يخضع لتحويل LValue إلى RVALUE ، والذي يحدث في i += ++i
قضية.
على الملاحظة الجانبية: لا تكتب مثل هذا الرمز في أي مشروع خطير. إنه يعتمد كثيرًا على معرفة قواعد التسلسل بالضبط وسيكون هناك الكثير من الأشخاص الذين لا يفهمون قواعد التسلسل بشكل صحيح ، أو غير مدركين للتغيير في القواعد التي هي نتيجة للدكتور 637 أو يتعثرون من خلال فقدان بعض الأهمية جوانب التعبير المعني (كما حدث لي عند تكوين المراجعة الأولى لهذه الإجابة).