Fark etmez. Bir vararg olarak bir float
almak mümkün değildir: Sağladığınız herhangi bir float
argümanı ilk olarak double
'a yükseltilmiştir.
6.5.2.2/6, "varsayılan argüman promosyonlarını" tanımlar ve/7, "argüman argümanlarına" varsayılan argüman tanıtımlarının uygulandığını belirtir, yani ...
ile gösterilen varargs.
scanfs/sscanf için nasıl çalışır?
scanf
için %f
biçimi float
bir işaretçi gerektirir. %lf
, double
, %Lf
için bir işaretçi gerektirir long double
için bir işaretçi gerektiriyor.
bir geçici değer kopyalama ve döküm (bu doğru mu?) Eğer bir şamandıra argüman sağlarsanız
ardından uygulama şamandıra değeri ile başlatır, double türünde bir geçici oluşturur ve bunu vararg olarak geçirir. Tanıma göre döküm, döküm operatörünün kullanımıyla açık dönüşümüdür - ne olup bittiğini okuyucuya tam olarak açık hale getirmek için isterseniz, float f = 3; printf("%f", f);
tam olarak float f = 3; printf("%f", (double)f);
ile aynıdır. Varsayılan argüman tanıtımı, cast ile aynı anlama sahiptir.
[Neden printf() bir float'ı ikiye katıyor?] (Http://stackoverflow.com/q/28097564/995714) –