سؤال

أنا مقتنع جدًا بالتفسير الذي وجدته قال ذلك 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 أو يتعثرون من خلال فقدان بعض الأهمية جوانب التعبير المعني (كما حدث لي عند تكوين المراجعة الأولى لهذه الإجابة).

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