printf() は %f だけで問題ないのに、なぜ scanf() は double に対して %lf を必要とするのですか?

C は、可変引数を取る関数の float を double にプロモートするためです。ポインターは何にも昇格されないため、 09 を使用する必要があります 、 18 または 26 (または 30 C99 で) double で読み取る


С99 以降、C の書式指定子と浮動小数点引数の型の一致は 48 の間で一貫しています。 および 56 .

です
  • 69 71 の場合
  • 88 97 の場合
  • 105 112 の場合

タイプ 128 の引数が 可変引数として渡され、そのような引数は暗黙的に型 132 に変換されます .これが 144 の理由です 書式指定子 157164 同等で交換可能です。 177184 を「クロスユース」できます 195 で または 200 218 で .

しかし、実際にそれを実際に行う理由はありません。 227 を使用しないでください 236 へ タイプ 249 の引数 .これは C89/90 時代に生まれた一般的な習慣ですが、悪い習慣です。 259 を使用 263278 の場合 282 を保持します 293 用に予約済み 引数。


303 315 が指すデータのサイズを知る必要があります 適切に埋めるために、可変個引数関数は float を double に昇格します (理由は完全にはわかりません)。 常に 338 を取得しています .