1. ホーム
  2. c

[解決済み] C言語における%fと%lfの違いは何ですか?

2022-03-06 04:19:07

質問

C言語の本で、C言語の例でこの2つのパラメータを見ましたが、著者はこの2つの違いが何であるか詳しく説明していません。私が知っているのは %f は、floatが代わりになるように指定します。調べてみたのですが、このw記号を見つけるのに苦労しました。についてはどうでしょうか。 %lf ?

解決方法は?

に影響を与えないというのが、端的な答えです。 printf の使用を示しています。 float または doublescanf .

について printf のようなタイプの引数は float に昇格します。 double ということで、両方の %f%lfdouble . について scanf を使用する必要があります。 %f に対して float%lf に対して double .

以下、言語専門家のために詳しく説明します。


との違いはありません。 %f%lf の中に printf ファミリーを使用します。ISO C規格(中の参照はすべてC11から)、セクション 7.21.6.1 The fprintf function 段落 /7 の状態では l という修飾語(私の強調)があります。

以下のように指定します。 d , i , o , u , x または X 変換指定子が適用されるのは long int または unsigned long int 引数で、次の n へのポインタに適用される変換指定子です。 long int 引数で、次の c 変換指定子が適用されるのは wint_t 引数で、次の s へのポインタに適用される変換指定子です。 wchar_t の引数を指定します。 には効果がなく、次の a , A , e , E , f , F , g または G 変換指定子。

を変更する必要がないのは、そのためです。 f 指定子は、その指定子 すでに を表します。 double 段落から /8 の型が記載されている同セクションの %f 指定子を使用します。

A double 浮動小数点数を表す引数は、10進数表記に変換されます。

これは、関数プロトタイプの楕円の後にある引数が、以下のセクションにあるようにデフォルトの引数プロモションの対象となることと関係があります。 6.5.2.2 Function calls 段落 /7 :

関数プロトタイプの宣言子で省略記法を使用すると、最後に宣言されたパラメータ以降で引数の型変換を停止します。デフォルトの引数昇格は、末尾の引数に対して実行されます。

以来 printf (そして、全体の ファミリー printf -のような関数) は、次のように宣言されます。 int printf(const char * restrict format, ...); を省略記法で記述した場合、そのルールがここで適用されます。デフォルトの引数プロモーションは、セクション 6.5.2.2 Function calls 段落 /6 :

呼び出された関数を表す式がプロトタイプを含まない型である場合、各引数に対して整数の昇格が行われ 型である引数は float に昇格します。 double . これらは、デフォルトの引数プロモーションと呼ばれます。


については scanf ファミリーを使用することを義務付けています。 double ではなく float . セクション 7.21.6.2 The fscanf function /11 :

以下のように指定します。 d , i , o , u , x , X または n の型へのポインタを持つ引数に適用される。 long int または unsigned long int ; その次の a , A , e , E , f , F , g または G の型へのポインタを持つ引数に適用される。 double ; または、次の c , s または [ の型へのポインタを持つ引数に適用される。 wchar_t .

これは /12 の場合、そのセクションの段落は、次のようになります。 %f :

オプションで符号付き浮動小数点数、無限大、または NaN の主語シーケンスに期待されるものと同じ形式である。 strtod 関数を使用します。対応する引数は、floating へのポインタでなければならない。