引数がaであるかa であるかに関わらず、「を読むとき、いつ使用できるのか」に「」scanf()
が必要なのはなぜですか。l
%lf
double
printf()
%f
double
float
コード例:
double d;
scanf("%lf", &d);
printf("%f", d);
&
子で変数の「アドレスを取得」すると、その演算の結果は、メモリ内の変数の格納場所へのポインターになります。に渡されるのはそのポインタscanf
です。
引数がaであるかa であるかに関わらず、「を読むとき、いつ使用できるのか」に「」scanf()
が必要なのはなぜですか。l
%lf
double
printf()
%f
double
float
コード例:
double d;
scanf("%lf", &d);
printf("%f", d);
&
子で変数の「アドレスを取得」すると、その演算の結果は、メモリ内の変数の格納場所へのポインターになります。に渡されるのはそのポインタscanf
です。
回答:
С99以降、Cの書式指定子と浮動小数点引数の型の一致はprintf
、との間で一貫していscanf
ます。です
%f
ために float
%lf
ために double
%Lf
ために long double
typeのfloat
引数が可変個引数として渡されると、そのような引数は暗黙的にtypeに変換されdouble
ます。これが、printf
書式指定子%f
と%lf
が同等で交換可能な理由です。ではprintf
、あなたは、「利用を横断する」ことが可能%lf
とfloat
か%f
とdouble
。
しかし、実際にそれを行う理由はありません。使用しないでください%f
にprintf
型の引数double
。それはC89 / 90回に生まれた広範囲の習慣ですが、それは悪い習慣です。for を使用%lf
しprintf
、引数用に予約してください。double
%f
float
%f
、使用%lf
が失敗する可能性があるのに対し、printf での使用 は良い習慣だと思います。残念ながら、その状況は実際に起こります。
printf
、との間で一貫していscanf
ます。 これは、同じ形式指定子を使用しても、aによって書き込まれたデータ[f]printf()
をが読み取れることを意味するわけではないことに注意してください[f]scanf()
。一般に、で使用されたものと同じフォーマット指定子をscanf()
使用してprintf()
も、データは正常に読み取られません。たとえば、prinf()
' "%d"
形式指定子によって挿入できるスペースのパディング"%d"
は、scanf()
呼び出しで同じ形式指定子によってスキップされます。
scanf
が指すデータのサイズを&d
正しく満たすには、がそれを知る必要がありますが、可変個関数は浮動小数点数を倍精度浮動小数点数に昇格させるので(理由は完全にはわかりません)、printf
常にを取得しdouble
ます。
Cの式でfloatまたはdoubleの値を使用すると、とにかくdoubleの値になるため、printfは違いを識別できません。一方、doubleへのポインタは、floatへのポインタとは異なるものとしてscanfに明示的に通知する必要があります。これは、ポインタが指すことが重要であるためです。
float
値が自動的に昇格さdouble
れました。その規則は標準Cで放棄されました。通常、式ではfloat
昇格さdouble
れません。これはdouble
、可変個引数として渡された場合にのみ昇格されます。これは、この場合に起こります。