187

引数が a であるか aであるかに関係なく、 a を読み取るときに in " "が必要なscanf()のはなぜですか?l%lfdoubleprintf()%fdoublefloat

コード例:

double d;
scanf("%lf", &d);
printf("%f", d);
4

5 に答える 5

216

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

于 2008-10-16T23:06:56.217 に答える
31

printfС99 以降、C の書式指定子と浮動小数点引数の型の一致は、との間で一貫していscanfます。それは

  • %f為にfloat
  • %lf為にdouble
  • %Lf為にlong double

type の引数floatが可変引数として渡されると、そのような引数は暗黙的に type に変換されdoubleます。printfこれが、フォーマット指定子%fで と%lfが同等で交換可能である理由です。では、またはとprintf「相互使用」できます。%lffloat%fdouble

しかし、実際にそれを実際に行う理由はありません。type の引数には使用%fしないでください。これは C89/90 時代に生まれた一般的な習慣ですが、悪い習慣です。forで使用し、引数用に予約しておきます。printfdouble%lfprintfdouble%ffloat

于 2015-01-29T18:58:50.350 に答える
17

scanfが指すデータのサイズを適切に埋めるために知る必要がありますが、可変引数関数は float を double に昇格させます (理由は完全にはわかり&dません) 。printfdouble

于 2008-10-16T23:09:12.827 に答える
7

そうしないと、scanf は double よりも小さいサイズの float へのポインターを渡していると見なし、正しくない値を返すためです。

于 2008-10-16T23:10:28.097 に答える
3

C 式で float 値または double 値を使用すると、とにかく double の値になるため、printf は違いを判断できません。double へのポインターは、float へのポインターとは異なるものとして、scanf に明示的に通知する必要があります。これは、ポインターが指すものが重要であるためです。

于 2008-10-16T23:09:59.157 に答える