doubleprintfの正しいフォーマット指定子は何ですか? %fそれですか、%lfそれともですか?だと%f思いますが、よくわかりません。
コードサンプル
#include <stdio.h>
int main()
{
double d = 1.4;
printf("%lf", d); // Is this wrong?
}
doubleprintfの正しいフォーマット指定子は何ですか? %fそれですか、%lfそれともですか?だと%f思いますが、よくわかりません。
#include <stdio.h>
int main()
{
double d = 1.4;
printf("%lf", d); // Is this wrong?
}
"%f"double の (または少なくとも 1 つの) 正しい形式です。aをに渡そうとすると、 1を受け取る前にに昇格するため、 a の形式はありません。は現在の標準でも受け入れられます。変換指定子 (とりわけ) が後に続く場合、 は効果がないと指定されます。floatfloatprintfdoubleprintf"%lf"lf
これは、フォーマット文字列が(およびなど) フォーマット文字printf列と大きく異なる1 つの場所であることに注意してください。出力の場合、値を渡します。これは、可変引数として渡されるとからに昇格されます。入力の場合、昇格されないポインターを渡しているため、 aまたは aを読み取るかどうかを指定する必要があります。したがって、 forはa を読み取りたいことを意味し、 a を読み取りたいことを意味しますの場合は、 またはのいずれかを使用します) 。scanffscanffloatdoublescanffloatdoublescanf%ffloat%lfdoublelong double%Lfprintfscanf
1. C99、§6.5.2.2/6: 「呼び出された関数を示す式がプロトタイプを含まない型を持っている場合、各引数に対して整数昇格が実行され、float 型の引数は double に昇格されます。これらは、デフォルト引数プロモーションと呼ばれます。」C++ では、言葉遣いが多少異なります (たとえば、「プロトタイプ」という言葉は使用されません) が、効果は同じです: すべての可変引数は、関数によって受け取られる前にデフォルトの昇格を受けます。
C99標準(つまり、N1256ドラフト)を考えると、ルールは関数の種類(fprintf(printf、sprintf、...)またはscanf)によって異なります。
抽出された関連部分は次のとおりです。
序文
この第2版は、第1版のISO / IEC 9899:1990をキャンセルし、ISO / IEC 9899 / COR1:1994、ISO / IEC 9899 / AMD1:1995、およびISO / IEC 9899 / COR2:1996によって修正および修正されています。前版からの主な変更点は次のとおりです。
%lfで許可される変換指定子printf7.19.6.1
fprintf機能7長さ修飾子とその意味は次のとおりです。
l(ell)(...)が後続のa、A、e、E、f、F、g、またはG変換指定子に影響を与えないことを指定します。
L後続のa、A、e、E、f、F、g、またはG変換指定子がlongdouble引数に適用されることを指定します。
に指定されたものと同じルールが、および同様の機能にfprintf適用されます。printfsprintf
7.19.6.2
fscanf関数11長さ修飾子とその意味は次のとおりです。
l(ell)次のa、A、e、E、f、F、g、またはG変換指定子がdoubleへの型ポインターを持つ引数に適用されることを指定します(...)。
L後続のa、A、e、E、f、F、g、またはG変換指定子が、longdoubleへの型ポインターを持つ引数に適用されることを指定します。
12変換指定子とその意味は次のとおりです。a、e、f、gオプションで符号付きの浮動小数点数に一致します(...)
14変換指定子A、E、F、G、およびXも有効であり、それぞれa、e、f、g、およびxと同じように動作します。
簡単に言うとfprintf、次の指定子と対応するタイプが指定されています。
%f ->ダブル%Lf->ロングダブル。そしてfscanfそれは:
%f ->フロート%lf->ダブル%Lf->ロングダブル。%f、%gまたは%e数値をどのようにフォーマットするかによって異なります。詳しくはこちらをご覧ください。withではl修飾子が必要ですが、では必要ありません。scanfdoubleprintf
Formatは、あなたが使用したのとまったく同じ%lf、 の完全に正しいprintf形式です。doubleコードに問題はありません。
形式%lfinprintfは、C 言語の古い (C99 より前の) バージョンではサポートされていませんでしdoubleた。その表面的な矛盾は C99 で修正されました。printfscanf
in で使用%lfする必要はありません。必要に応じて、同様に使用できます(とは で同等です)。しかし、現代の C では、 with 、withおよびwithを一貫して および の両方で使用することを好むのは完全に理にかなっています。doubleprintf%f%lf%fprintf%ffloat%lfdouble%Lflong doubleprintfscanf
%Lf(大文字に注意してくださいL) はlong doubleの書式指定子です。
プレーンの場合、、 、、またはdoublesのいずれかになります。%e%E%f%g%G