سؤال

x = 1;
std::cout << ((++x)+(++x)+(++x));

أتوقع أن يكون الإخراج 11, ، لكنها في الواقع 12. وبعد لماذا ا؟

هل كانت مفيدة؟

المحلول

نوضح ذلك من خلال التوقع السلوك غير محدد بدلا من أي نتيجة معينة. كما يحاول التعبير تعديل x عدة مرات دون تدخل نقطة التسلسل إنه السلوك غير محدد.

نصائح أخرى

كما قال آخرون، فإن معايير C و C ++ لا تحدد السلوك الذي سينتج عنه هذا.

ولكن بالنسبة لأولئك الأشخاص الذين لا يرون لماذا ستقوم المعايير بمثل هذا الشيء، دعنا نذهب من خلال مثال "عالم حقيقي":

1 * 2 + 3 + 4 * 5

لا يوجد شيء خاطئ في حساب 1 * 2 + 3 قبل حساب 4*5. وبعد فقط لأن الضرب لهما أسبقية أعلى من الإضافة لا يعني أننا نحتاج إلى أداء الكل الضرب في التعبير قبل القيام بأي إضافة. في الواقع، هناك العديد من الأوامر المختلفة التي يمكن أن تؤديها بشكل صحيح إجراء العمليات الحسابية الخاصة بك.

حيث توجد تقييمات آثار جانبية، يمكن أن تؤثر أوامر تقييم مختلفة على النتيجة. إذا كان المعيار لا يحدد السلوك، لا تعتمد عليه.

هذا هو في الواقع غير محدد. لا يعرف C ++ بشكل صريح ترتيب تنفيذ بيان لذلك يعتمد على التحويل البرمجي ولا ينبغي استخدام بناء الجملة هذا.

سوف يقطع الكود استدعاء السلوك غير محدد في كل من C / C ++. اقرأ عن نقطة التسلسل من هنا.

في رأيي

cout<<((++x)+(++x)+(++x));

البادئة أولا تشغيل البادئة ++ x حتى تصبح قيمة X

X = 2.


الآن بواسطة ++ x، سوف تصبح x

x = 3.


بعد ++ X.

x = 4.


الآن حان الوقت لإضافة قيم X

X + X + X = 4 + 4 + 4

X + X + X = 12

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