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