سؤال

لقد واجهت للتو خط الرمز هذا:

if( lineDirection.length2() ){...}

أين length2 إرجاع أ double. إنه نوع من الألغاز أن 0.0 يعادل 0 ، NULL, و/أو false.

هل هذا الجزء من معيار C ++ أم أنه سلوك غير محدد؟

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

المحلول

إنه سلوك قياسي كبير (تحويل منطقي)

$ 4.12/1 - "يمكن تحويل rvalue من الحساب أو التعداد أو المؤشر أو المؤشر إلى نوع العضو إلى rvalue من نوع bool يتم تحويله إلى صحيح ".

نصائح أخرى

تجدر الإشارة إلى أن هذا الرمز هش للغاية لتمثيل النقطة العائمة. سيعمل هذا الرمز إذا كانت قيمة النقطة العائمة فقط 0 ، والتي من غير المرجح في معظم الحالات. قد لا يكون ذلك في هذه الحالة بالذات ، ولكن يجب أن يتم توثيقه / التعليق عليه بالتأكيد.

في جميع المواقف الأخرى ، تحتاج إلى اتخاذ قرار بشأن "قيمة إبسيلون" يحدد هذا نطاق أرقام النقاط العائمة التي تعتبرها "نفس"-وإلا من المحتمل جدًا أن تفاجئك مقارناتك في الحالات الزاوية (وغالبًا ما تكون غير محددة).

نعم - المقارنة ضد الصفر (0.0) ، وإرجاع خطأ إذا كانت النتيجة صفرًا تمامًا ، وصحيحًا على خلاف ذلك.

ويرث السلوك من C ، والذي يعامل المقارنة المكافئة بنفس الطريقة.

عندما تقارن بدون عوامل ، فأنت تقارن "مع True" ، بحيث يتم التحقق من كل نوع متغير ليكون إما منطقية (حالة بسيطة) أو غيرها. تحتوي أنواع المتغيرات الرقمية على قيمتها الخاطئة التي يتم تعريفها على أنها "0" أو "0.0" أو نحو ذلك ، لذلك عندما تقارنها "مقابل True" ، ستعود مقارنة مع ذلك.

إذا كان الطول 2 يعود 0.0 ، فسيؤخذ على أنه خطأ. ولكن قد تحصل على نتيجة مفاجئة مع هذه المقارنة. أفضل استخدام قيمة Epsilon كما اقترح Madkeithv أثناء مقارنة النقطة العائمة.

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