double
printfの正しいフォーマット指定子は何ですか? %f
それですか、%lf
それともですか?だと%f
思いますが、よくわかりません。
コードサンプル
#include <stdio.h>
int main()
{
double d = 1.4;
printf("%lf", d); // Is this wrong?
}
double
printfの正しいフォーマット指定子は何ですか? %f
それですか、%lf
それともですか?だと%f
思いますが、よくわかりません。
#include <stdio.h>
int main()
{
double d = 1.4;
printf("%lf", d); // Is this wrong?
}
"%f"
double の (または少なくとも 1 つの) 正しい形式です。aをに渡そうとすると、 1を受け取る前にに昇格するため、 a の形式はありません。は現在の標準でも受け入れられます。変換指定子 (とりわけ) が後に続く場合、 は効果がないと指定されます。float
float
printf
double
printf
"%lf"
l
f
これは、フォーマット文字列が(およびなど) フォーマット文字printf
列と大きく異なる1 つの場所であることに注意してください。出力の場合、値を渡します。これは、可変引数として渡されるとからに昇格されます。入力の場合、昇格されないポインターを渡しているため、 aまたは aを読み取るかどうかを指定する必要があります。したがって、 forはa を読み取りたいことを意味し、 a を読み取りたいことを意味しますの場合は、 またはのいずれかを使用します) 。scanf
fscanf
float
double
scanf
float
double
scanf
%f
float
%lf
double
long double
%Lf
printf
scanf
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
で許可される変換指定子printf
7.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
適用されます。printf
sprintf
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
修飾子が必要ですが、では必要ありません。scanf
double
printf
Formatは、あなたが使用したのとまったく同じ%lf
、 の完全に正しいprintf
形式です。double
コードに問題はありません。
形式%lf
inprintf
は、C 言語の古い (C99 より前の) バージョンではサポートされていませんでしdouble
た。その表面的な矛盾は C99 で修正されました。printf
scanf
in で使用%lf
する必要はありません。必要に応じて、同様に使用できます(とは で同等です)。しかし、現代の C では、 with 、withおよびwithを一貫して および の両方で使用することを好むのは完全に理にかなっています。double
printf
%f
%lf
%f
printf
%f
float
%lf
double
%Lf
long double
printf
scanf
%Lf
(大文字に注意してくださいL
) はlong doubleの書式指定子です。
プレーンの場合、、 、、またはdoubles
のいずれかになります。%e
%E
%f
%g
%G