تحويلات النوع الضمنية في التعبيرات int للمضاعفة

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

سؤال

لقد كنت أحاول تقليل تحويلات النوع الضمنية عندما أستخدم الثوابت المسماة في الكود الخاص بي. على سبيل المثال بدلاً من استخدام

const double foo = 5;

سأستخدم

const double foo = 5.0;

بحيث لا يلزم إجراء تحويل النوع. ومع ذلك ، في التعبيرات حيث أفعل شيئًا كهذا ...

const double halfFoo = foo / 2;

إلخ. هل يتم تقييم 2 كصبع صحيح وهل تم تحويله ضمنيًا؟ هل يجب علي استخدام 2.0 بدلاً من ذلك؟

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

المحلول

ال 2 يتم تحويله ضمنيًا إلى مضاعفة بسبب foo مزدوج. عليك أن تكون حذرا لأنه إذا foo كان ، على سبيل المثال ، عدد صحيح ، سيتم تنفيذ عدد صحيح ، ثم سيتم تخزين النتيجة في halfFoo.

أعتقد أنه من الممارسات الجيدة استخدام الحرفيين العائمون دائمًا (على سبيل المثال 2.0 أو 2. أينما كنت تنوي استخدامهم كقيم الفاصلة العائمة. إنه أكثر اتساقًا ويمكن أن يساعدك في العثور على الحشرات الخبيثة التي يمكن أن تبرز مع هذا النوع من الأشياء.

نصائح أخرى

هذا هو المعروف باسم اكتب الإكراه. ويكيبيديا لديها قليلا حول هذا الموضوع:

يعد تحويل النوع الضمني ، والمعروف أيضًا باسم الإكراه ، تحويلًا تلقائيًا من قبل المترجم. تسمح بعض اللغات ، أو حتى المطلوبة ، بمجموعات المترجمين لتوفير الإكراه.

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

...

يجب استخدام هذا السلوك بحذر ، حيث يمكن أن تنشأ عواقب غير مقصودة. يمكن أن تضيع البيانات عند تحويل تمثيلات النقطة العائمة إلى تمثيلات متكاملة حيث سيتم اقتطاع المكونات الكسرية لقيم الفاصلة العائمة (مدورة لأسفل). على العكس من ذلك ، فإن التحويل من تمثيل متكامل إلى نقطة عائمة يمكن أن يفقد المرء الدقة ، لأن نوع النقطة العائمة قد يكون غير قادر عدد صحيح 16777217 بالضبط ، في حين يمكن نوع عدد صحيح 32 بت). يمكن أن يؤدي ذلك إلى مواقف مثل تخزين نفس قيمة عدد صحيح إلى متغيرين من عدد صحيح النوع والنوع الحقيقي الذي يعود خطأ إذا ما قورن للمساواة.

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

بالمعنى الدقيق للكلمة ، يبدو أن ما تحاول تحقيقه هو نتائج عكسية.

عادة ، يسعى المرء لتقليل عدد صريح اكتب التحويلات في برنامج C ، وبشكل عام ، لتقليل كل تبعيات وأي نوع في التعليمات البرمجية المصدر. يجب أن يكون رمز C الجيد مستقلًا قدر الإمكان. هذا يعني بشكل عام أنه من الجيد تجنب أي عناصر نحوية واضحة توضح أنواعًا محددة قدر الإمكان. من الأفضل أن تفعل

const double foo = 5; /* better */

من

const double foo = 5.0; /* worse */

لأن هذا الأخير زائد. سوف تتأكد قواعد تحويل النوع الضمنية للغة C من أن السابق يعمل بشكل صحيح. يمكن قول الشيء نفسه عن المقارنات. هذه

if (foo > 0)

أفضل من

if (foo > 0.0)

لأنه ، مرة أخرى ، فإن الأول أكثر استقلالًا من النوع.

تحويل النوع الضمني في هذه الحالة أمر جيد جدًا ، وليس شيئًا سيئًا. يساعدك على كتابة التعليمات البرمجية المستقلة عن النوع العام. لماذا تحاول تجنبهم؟

صحيح أنه في بعض الحالات ليس لديك خيار آخر سوى التعبير عن النوع بشكل صريح (مثل الاستخدام 2.0 بدلاً من 2 وهلم جرا). ولكن عادة ما يفعل ذلك فقط عندما يتعين على المرء حقًا. لماذا سيفعل شخص ما دون حاجة حقيقية هو أبعد مني.

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