scanf()に“%lf”が必要な理由doubleの場合、printf()で“%f&#8221 ;?

StackOverflow https://stackoverflow.com/questions/210590

  •  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 で一貫しています。

    float
  • %f
  • %lf double
  • の場合) long double
  • %Lf

たまたま、 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に明示的に通知する必要があります。これは、ポインタが指すものが重要なためです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top