في غضون فترة من الوقت ، هل آخر بيان مفصل للفاصلة مضمون لتشغيله آخر؟

StackOverflow https://stackoverflow.com/questions/4072578

سؤال

النظر في قطاع الكود (تافهة) التالية:

while (i++, i <= 10) {
  // some more code
}

في الحالة العامة ، يسمح C ++ بتقييم البيانات المنفصلة فاصلة بأي ترتيب. في حالة حلقة فترة ، هل نحن على الأقل مضمون (حسب المواصفات) التي يتم تقييم البيان الأخير (الذي يستخدم كشرط للحلقة) أخيرًا؟

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

المحلول

في الحالة العامة ، يسمح C ++ بتقييم البيانات المنفصلة فاصلة بأي ترتيب.

إذا كنت تشير إلى الفواصل بين وسيطات الوظائف ، فهذا مجرد فاصل.

في حالتك ، أنت تستخدم مشغل فاصلة, ، وهذا يقدم نقطة تسلسل تضمن أن جميع الآثار الجانبية من المعامل الأيسر للفاصلة قد استقرت قبل تقييم النقطة اليمنى.

نعم ، إنه محدد جيدًا.

من القسم 5.18/1 من معيار ISO C ++ 98:

يتم تقييم زوج من التعبيرات مفصولة بفاصلة من اليسار إلى اليمين ويتم التخلص من قيمة التعبير الأيسر. لا يتم تطبيق التحويلات القياسية من LVALUE إلى RVALUE (4.1) ، صفيف إلى مؤشر (4.2) ، والوظيفة إلى المؤشر (4.3) على التعبير الأيسر. يتم تنفيذ جميع الآثار الجانبية (1.9) من التعبير الأيسر ، باستثناء تدمير المنشرين (12.2) ، قبل تقييم التعبير الصحيح. نوع وقيمة النتيجة هي نوع وقيمة المعامل الأيمن ؛ والنتيجة هي lvalue إذا كان المعامل الأيمن.

نصائح أخرى

نعم. ال , المشغل (ما لم يتم تحميله الزائد!) يقدم ما يسمى نقطة التسلسل ويضمن بالفعل ترتيب التنفيذ من اليسار إلى اليمين.

أوضحت التعليقات أعلاه ذلك. وأحد الطرق المشتركة لإساءة استخدام هذه الطريقة

while(scanf("%d", &n), n){
    // do something
}

هذا سوف يقرأ عدد صحيح حتى نقرأ الصفر.

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