scanf()に“%lf”が必要な理由doubleの場合、printf()で“%f&#8221 ;?
-
03-07-2019 - |
質問
scanf()
に" %lf
"の l
が必要な理由 double
を読むとき、 printf()
が" %f
"を使用できるとき引数が double
であるか float
であるかに関係なく、
サンプルコード:
double d;
scanf("%lf", &d);
printf("%f", d);
解決
Cは、可変引数を取る関数のfloatをdoubleに昇格させるためです。ポインターは何にも昇格されないため、%lf
、%lg
、または%le
(または%la
(C99))をダブルで読み取ります。
他のヒント
С 99以降、Cの書式指定子と浮動小数点引数タイプの一致は、 printf
と scanf
で一貫しています。
-
%f
-
%lf
(double
の場合)
-
%Lf
float
の long double
のたまたま、 float
型の引数が可変引数として渡されると、そのような引数は暗黙的に double
型に変換されます。これが、 printf
形式指定子%f
と%lf
が同等で互換性がある理由です。 printf
では、「相互使用」できます。 float
を含む%lf
または double
を含む%f
。
しかし、実際に実際に行う理由はありません。タイプ double
の引数 printf
に%f
を使用しないでください。それは、C89 / 90時代に生まれた広範な習慣ですが、悪い習慣です。 double
には printf
の%lf
を使用し、 float
引数には%f
を予約しておきます。
scanf
は、適切に入力するために& d
が指すデータのサイズを知る必要がありますが、可変長関数はfloatをdoubleに昇格します(理由は完全にはわかりません) )、 printf
は常に double
を取得しています。
そうしないと、scanfは、doubleよりも小さいサイズのfloatへのポインターを渡していると判断し、誤った値を返します。
C式でfloat値またはdouble値を使用すると、とにかくdoubleの値になるため、printfは違いを判別できません。一方、doubleへのポインタは、floatへのポインタとは異なるものとしてscanfに明示的に通知する必要があります。これは、ポインタが指すものが重要なためです。