البرمجة

تأثير استخدام مواصفات غير صحيحة في printf في لغة C

في الكود البرمجي الذي قدمته، يتم استخدام مواصف النوع (specifier) للعدد الصحيح %d في دالة printf لطباعة قيمة عائمة (floating-point). هذا يؤدي إلى نتائج غير متوقعة، وهو ما يحدث بسبب التبديل في التمثيل الداخلي للأعداد في الذاكرة.

في السطر:

c
printf("%d\n", 5 / (float)4.7);

يتم قسم 5 على (float)4.7، وهذا يؤدي إلى الحصول على قيمة عائمة (floating-point). ومع ذلك، عندما يتم تنسيقها باستخدام %d، يتم فرض تمثيلها كرقم صحيح، مما يؤدي إلى فقدان الأرقام العشرية والاحتفاظ فقط بالجزء الصحيح من القيمة. في هذه الحالة، يتم تحويل قيمة العائمة إلى عدد صحيح.

هنا يكمن سبب النتيجة 1610612736. يجب أن تكون القيمة المتوقعة هي 1، ولكن بسبب استخدام مواصف النوع الخاطئة في printf، يتم تفسير القيمة العائمة بشكل غير صحيح.

لتصحيح هذا، يجب استخدام مواصف النوع الصحيحة للقيمة العائمة، وهي %f. لذا، يمكنك تحديث الكود كالتالي:

c
printf("%f\n", 5 / (float)4.7);

باستخدام %f ستحصل على النتيجة المتوقعة 1.000000.

المزيد من المعلومات

عند التعامل مع لغة البرمجة C، يتعين عليك أن تكون حذرًا عند استخدام مواصفات النوع في دوال الإدخال والإخراج مثل printf و scanf. استخدام مواصف النوع الخاطئة يمكن أن يؤدي إلى تفسير غير صحيح للبيانات والنتائج غير المتوقعة.

لفهم أفضل حول ما حدث في الكود البرمجي، دعنا نقوم بتفحص الكود بشكل أكثر تفصيلًا.

c
int main(void) { printf("%d\n", 5 / (float)4.7); printf("Size of int = %d", sizeof(int)); return 1; }
  1. السطر الأول: printf("%d\n", 5 / (float)4.7);

    • هنا يتم قسم 5 على (float)4.7، وهو ينتج قيمة عائمة. ومع ذلك، %d في printf يعامل القيمة عائمة كعدد صحيح، مما يؤدي إلى طباعة نتيجة غير متوقعة.
  2. السطر الثاني: printf("Size of int = %d", sizeof(int));

    • هذا السطر يقوم بطباعة حجم نوع البيانات int باستخدام sizeof، ولكن هنا يتم استخدام %d، وهو مواصف النوع المخصصة للأعداد الصحيحة، وليس للقيمة التي تعيد sizeof التي هي بالفعل قيمة صحيحة.

لتحسين الكود وتصحيح هذه المشكلتين، يمكنك استخدام %f للقيمة العائمة و %zu لحجم النوع:

c
int main(void) { printf("%f\n", 5 / (float)4.7); printf("Size of int = %zu", sizeof(int)); return 1; }

باستخدام هذه التغييرات، سيتم طباعة القيمة العائمة بشكل صحيح وحجم النوع int سيتم طباعته بشكل صحيح أيضًا.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر