printfのダブルの正しい形式仕様
-
27-09-2019 - |
質問
正しい形式の仕様は何ですか double
printfで?それは...ですか %f
またはそれは %lf
?そうだと思います %f
, 、しかし、私はよくわかりません。
コードサンプル
#include <stdio.h>
int main()
{
double d = 1.4;
printf("%lf", d); // Is this wrong?
}
解決
"%f"
ダブルの正しい形式(または少なくとも1つ)です。三 は aの形式はありません float
, 、aを渡そうとした場合 float
に printf
, 、昇進します double
前 printf
それを受け取ります1. "%lf"
また、現在の標準でも受け入れられます l
フォローしている場合、効果がないと指定されています f
変換仕様(とりわけ)。
これが1つの場所であることに注意してください printf
フォーマット文字列は大きく異なります scanf
(と fscanf
, など)フォーマット文字列。出力の場合、あなたはaを渡します 価値, 、それは昇進します float
に double
バリアードパラメーターとして渡された場合。入力については、渡します ポインター, 、宣伝されていないので、あなたは伝えなければなりません scanf
読みたいかどうか float
またはa double
, 、だから scanf
, %f
あなたが読みたいという意味です float
と %lf
あなたが読みたいという意味です double
(そして、それが価値があることのために、 long double
, 、 あなたが使う %Lf
どちらか printf
また scanf
).
1. C99、§6.5.2.2/6:「呼び出された関数を示す式にプロトタイプを含まないタイプを持っている場合、整数プロモーションは各引数で実行され、タイプのフロートがある引数は2倍に宣伝されます。これらはデフォルトの引数プロモーションと呼ばれます。」 C ++では、文言は多少異なります(例えば、「プロトタイプ」という単語を使用しません)が、効果は同じです。すべてのバリアードパラメーターは、関数が受信する前にデフォルトのプロモーションを受けます。
他のヒント
与えられた C99 標準(すなわち、 N1256 ドラフト)、ルールは関数の種類に依存します:fprintf(printf、sprintf、...)またはscanf。
ここに関連するパーツが抽出されます。
序文
この第2版は、ISO/IEC 9899/COR1:1994、ISO/IEC 9899/AMD1:1995、およびISO/IEC 9899/COR2:1996:ISO/IEC 9899/Cor1によって修正および修正された第1版ISO/IEC 9899:1990をキャンセルおよび置き換えます。以前の版からの主要な変更には次のものがあります。
%lf
許可される変換仕様printf
7.19.6.1
fprintf
働き7 長さの修飾子とその意味は次のとおりです。
l (ELL)は、(...)が次のA、a、e、e、f、f、g、またはg変換仕様に影響を与えないことを指定します。
l 次のa、a、e、e、f、g、またはg変換指定子が長い二重引数に適用されることを指定します。
同じルールが指定されています fprintf
申請する printf
, sprintf
同様の機能。
7.19.6.2
fscanf
働き11 長さの修飾子とその意味は次のとおりです。
l (ELL)は、次のA、e、e、e、f、f、g、またはg変換仕様がタイプポインターを持つ引数に適用されることを(...)指定します。
l 次のa、a、e、e、f、f、g、またはgの変換指定子が、long doubleのタイプポインターを持つ引数に適用されることを指定します。
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
数値をフォーマットする方法によって異なります。見る ここ 詳細については。 l
修飾子が必要です scanf
と double
, 、ではありません printf
.
正しい printf
のフォーマット double
は %lf
, 、まさにあなたがそれを使用したように。あなたのコードには何の問題もありません。
フォーマット %lf
の printf
古い(PRE-C99)バージョンのC言語ではサポートされていませんでした。 double
の printf
と scanf
. 。その表面的な矛盾はC99で修正されています。
したがって、現代Cでは、使用することを好むのは完全に理にかなっています %f
と float
, %lf
と double
と %Lf
と long double
両方で一貫して printf
と scanf
.
ダブルの場合、単に使用できます %lf
または、好みに応じてフォローを使用できます
%e
また %E
指数形式の値の場合
%g
また %G
通常の表記法または指数表記のいずれかについて、その大きさに適した方がいずれの方も。
こちらをご覧ください cのすべてのフォーマット仕様のリスト