Õige vormingu täpsustaja double jaoks printfis

Milline on õige vormingupunkt "double" printfis? Kas see on %f või %lf? Ma usun, et see on %f, kuid ma ei ole kindel.

Koodinäide

#include <stdio.h>

int main()
{
   double d = 1.4;
   printf("%lf", d); // Is this wrong?
}
Lahendus

"%f" on (või vähemalt üks) õige vorming topelt. Formaat float jaoks ei ole, sest kui sa üritad floati printfile üle anda, muutub see doubleiks, enne kui printf saab selle1. "%lf" on praeguse standardi kohaselt samuti aktsepteeritav -- l on määratletud, et sellel ei ole mingit mõju, kui sellele järgneb (muu hulgas) konverteerimise spetsiifikaator f.

Pange tähele, et see on üks koht, kus printf-formaatjooned erinevad oluliselt scanf (ja fscanf jne) formaatjoontest. Väljundi jaoks edastad sa väärtuse, mis tõstetakse float'istdouble'-ks, kui see antakse üle variatiivse parameetrina. Sisendiks edastad sa näitaja, mida ei edendata, nii et sa pead scanfile ütlema, kas sa tahad lugeda floati või doublei, nii et scanfi puhul tähendab %f, et sa tahad lugeda floati ja %lf, et sa tahad lugeda doublei (ja, kui see on midagi väärt, siis long doublei puhul kasutad %Lfi kas printfi või scanfi puhul).


  1. C99, §6.5.2.2/6: "Kui kutsutud funktsiooni tähistav väljendus on tüübilt, mis ei sisalda prototüüpi, tehakse igale argumendile täisarvude edutamine ja argumendid, mis on tüübilt float, edutatakse tüübiks double. Neid nimetatakse vaikimisi argumendipromotsioonideks." C++ keeles on sõnastus mõnevõrra erinev (nt ei kasutata sõna "prototüüp"), kuid mõju on sama: kõik variatiivsed parameetrid läbivad vaikimisi promootsioonid, enne kui funktsioon neid vastu võtab.
Kommentaarid (6)

See võib olla %f, %g või %e, sõltuvalt sellest, kuidas soovite numbri vormindamist. Vaata siin lisateavet. Modifikaator l on vajalik scanfis koos doublega, kuid mitte printfis.

Kommentaarid (2)

%Lf (pange tähele suurt "L") on formaadi täpsustaja pikkade paaride jaoks.

Tavalise double puhul piisab kas %e, %E, %f, %g või %G.

Kommentaarid (3)