لماذا يحتاج Scanf () إلى "٪ LF" للزوجين ، عندما يكون printf () على ما يرام مع "٪ f" فقط؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

هو السبب في أن scanf() يحتاج l في "%lf"عند قراءة أ double, ، متى printf() يمكن استخدام "%f"بغض النظر عما إذا كانت حجتها هي double أو أ float?

رمز المثال:

double d;
scanf("%lf", &d);
printf("%f", d);
هل كانت مفيدة؟

المحلول

لأن C سوف يعزز العوامات إلى الزوجي للوظائف التي تأخذ وسيطات متغيرة. لم يتم ترقية المؤشرات إلى أي شيء ، لذلك يجب أن تستخدم %lf, %lg أو %le (أو %la في C99) للقراءة في الزوجي.

نصائح أخرى

منذ с99 ، فإن المطابقة بين مواصفات التنسيق وأنواع الوسيطة الفاصلة في C تتسق بين printf و scanf. إنها

  • %f إلى عن على float
  • %lf إلى عن على double
  • %Lf إلى عن على long double

يحدث ذلك فقط أنه عندما يكون الحجج من النوع float يتم تمريرها كمعلمات متغيرة ، يتم تحويل هذه الوسائط ضمنيًا إلى النوع double. هذا هو السبب في وجود في printf تنسيق المحددات %f و %lf مكافئة وقابلة للتبديل. في printf يمكنك "الاستخدام المتقاطع" %lf مع float أو %f مع double.

ولكن لا يوجد سبب للقيام بذلك في الواقع. لا تستخدم %f إلى printf حجج النوع double. إنها عادة واسعة النطاق ولدت مرة أخرى في C89/90 مرة ، لكنها عادة سيئة. يستخدم %lf في printf إلى عن على double والحفاظ على %f محجوز ل float الحجج.

scanf يحتاج إلى معرفة حجم البيانات التي يتم توجيهها بواسطة &d لملئه بشكل صحيح ، في حين أن وظائف المتغيرات تعزز العوامات إلى الزوجي (غير متأكد تمامًا لماذا) ، لذا printf دائما الحصول على ملف double.

نظرًا لأن ScanF سيعتقد أنك تمرر مؤشرًا إلى تعويم وهو حجم أصغر من مزدوج ، وسوف يعيد قيمة غير صحيحة.

إن استخدام إما تعويم أو قيمة مزدوجة في تعبير C سيؤدي إلى قيمة مزدوجة على أي حال ، لذلك لا يمكن لـ PrintF معرفة الفرق. في حين أن المؤشر إلى مزدوج يجب أن يشير صراحة إلى ScanF على أنه متميز عن مؤشر إلى تعويم ، لأن ما يشير إليه المؤشر هو ما يهم.

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