printf の double の正しい書式指定子 質問する

printf の double の正しい書式指定子 質問する

doubleの正しい書式指定子は何ですかprintf?%fそれとも ですか%lf? だと思います%fが、確信はありません。

コードサンプル

#include <stdio.h>

int main()
{
   double d = 1.4;
   printf("%lf", d); // Is this wrong?
}

ベストアンサー1

"%f"は、double の正しい形式 (または少なくとも 1 つの正しい形式) です。には形式がありませんをにfloat渡そうとすると、 がそれを受け取る前にに昇格されるためです1。も現在の標準では許容されます。 は、変換指定子 (など)が続く場合は効果がないものと指定されています。floatprintfdoubleprintf"%lf"lf

これは、書式指定文字列が(およびなど) 書式指定文字列printfと大幅に異なる点の 1 つであることに注意してください。出力の場合、を渡しますが、これは可変長引数として渡されるときにから に昇格されます。入力の場合、ポインタを渡しますが、これは昇格されないため、と のどちらを読み取るかを指定する必要があります。つまり、の場合、は を読み取ることを意味し、は を読み取ることを意味します(参考までに、 の場合、または のいずれかに を使用します)。scanffscanffloatdoublescanffloatdoublescanf%ffloat%lfdoublelong double%Lfprintfscanf


1. C99、§6.5.2.2/6: 「呼び出された関数を表す式の型にプロトタイプが含まれていない場合、各引数に対して整数昇格が実行され、float 型の引数は double に昇格されます。これらは、デフォルトの引数昇格と呼ばれます。」 C++ では、表現が多少異なります (たとえば、「プロトタイプ」という単語は使用されません) が、効果は同じです。すべての可変長パラメータは、関数によって受け取られる前にデフォルトの昇格を受けます。

おすすめ記事