引数がaであるかa であるかに関わらず、「を読むとき、いつ使用できるのか」に「」scanf()が必要なのはなぜですか。l%lfdoubleprintf()%fdoublefloat
コード例:
double d;
scanf("%lf", &d);
printf("%f", d);
&子で変数の「アドレスを取得」すると、その演算の結果は、メモリ内の変数の格納場所へのポインターになります。に渡されるのはそのポインタscanfです。
引数がaであるかa であるかに関わらず、「を読むとき、いつ使用できるのか」に「」scanf()が必要なのはなぜですか。l%lfdoubleprintf()%fdoublefloat
コード例:
double d;
scanf("%lf", &d);
printf("%f", d);
&子で変数の「アドレスを取得」すると、その演算の結果は、メモリ内の変数の格納場所へのポインターになります。に渡されるのはそのポインタscanfです。
回答:
С99以降、Cの書式指定子と浮動小数点引数の型の一致はprintf、との間で一貫していscanfます。です
%f ために float%lf ために double%Lf ために long doubletypeのfloat引数が可変個引数として渡されると、そのような引数は暗黙的にtypeに変換されdoubleます。これが、printf書式指定子%fと%lfが同等で交換可能な理由です。ではprintf、あなたは、「利用を横断する」ことが可能%lfとfloatか%fとdouble。
しかし、実際にそれを行う理由はありません。使用しないでください%fにprintf型の引数double。それはC89 / 90回に生まれた広範囲の習慣ですが、それは悪い習慣です。for を使用%lfしprintf、引数用に予約してください。double%ffloat
%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、可変個引数として渡された場合にのみ昇格されます。これは、この場合に起こります。