2011-06-18 21 views
37

arasındaki farkları nasıl yazıyor? Yazılmamış olduğundan, doğru bellek boyutunu seçtiğini ve argüman türüne göre yorumladığını düşündüm. Ancak float ve double, her ikisi de% f kullanır ve farklı boyutlardadır.printf ve co, float ile double

P.S. Değeri bir temp ve döküm (bu doğru mu?) Değerine kopyalayarak promosyonun nasıl çalıştığını görebiliyorum ama scanfs/sscanf için nasıl çalışıyor?

+0

[Neden printf() bir float'ı ikiye katıyor?] (Http://stackoverflow.com/q/28097564/995714) –

cevap

55

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.

+0

Scanf hakkında neler var? –

+0

Teşekkürler, printfs (standart veya uzantılar), simetriyi korumak için iki katı kadar kabul ediyor mu? –

+7

Oh, "printf" ve co'daki formatlarda% lf ve% Lf kullanabilir miyim? " % lf tam olarak% f ile aynıdır, her ikisi de bir "double" alır. % Lf bir 'uzun çifte' alır. –