引数が a であるか aであるかに関係なく、 a を読み取るときに in " "が必要なscanf()のはなぜですか?l%lfdoubleprintf()%fdoublefloat
コード例:
double d;
scanf("%lf", &d);
printf("%f", d);
引数が a であるか aであるかに関係なく、 a を読み取るときに in " "が必要なscanf()のはなぜですか?l%lfdoubleprintf()%fdoublefloat
コード例:
double d;
scanf("%lf", &d);
printf("%f", d);
C は、可変引数を取る関数の float を double にプロモートするためです。ポインターは何にも昇格されないため%lf、%lgまたは%le(または%laC99 では) を使用して double で読み取る必要があります。
printfС99 以降、C の書式指定子と浮動小数点引数の型の一致は、との間で一貫していscanfます。それは
%f為にfloat%lf為にdouble%Lf為にlong doubletype の引数floatが可変引数として渡されると、そのような引数は暗黙的に type に変換されdoubleます。printfこれが、フォーマット指定子%fで と%lfが同等で交換可能である理由です。では、またはとprintf「相互使用」できます。%lffloat%fdouble
しかし、実際にそれを実際に行う理由はありません。type の引数には使用%fしないでください。これは C89/90 時代に生まれた一般的な習慣ですが、悪い習慣です。forで使用し、引数用に予約しておきます。printfdouble%lfprintfdouble%ffloat
scanfが指すデータのサイズを適切に埋めるために知る必要がありますが、可変引数関数は float を double に昇格させます (理由は完全にはわかり&dません) 。printfdouble
そうしないと、scanf は double よりも小さいサイズの float へのポインターを渡していると見なし、正しくない値を返すためです。
C 式で float 値または double 値を使用すると、とにかく double の値になるため、printf は違いを判断できません。double へのポインターは、float へのポインターとは異なるものとして、scanf に明示的に通知する必要があります。これは、ポインターが指すものが重要であるためです。