لماذا يحتاج Scanf () إلى "٪ LF" للزوجين ، عندما يكون printf () على ما يرام مع "٪ f" فقط؟
-
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 على أنه متميز عن مؤشر إلى تعويم ، لأن ما يشير إليه المؤشر هو ما يهم.