1
#include <stdio.h>

 int main(int argc, const char * argv[])
 {

    float apples = 1.1;

    float bananas = 2.2;

    double fruit = apples + bananas;

    printf("%f.\n",fruit);

    return 0;

 }

わかりました....では、なぜこれに%fが必要なのですか?「fruit」の10進表記を印刷していることは理解していますが、「fruit」という数字を印刷するようにプログラムに要求できないのはなぜですか。「果物」を10進数の%fで印刷するか、科学的記数法の%eで印刷するかを宣言する必要があるからですか。また、私は時々%dに出くわしました。それは何を意味しますか?

4

7 に答える 7

2

printf 関数の定義を見ると、これらの値が %d : int 形式指定子 %f : float 形式指定子として渡されていることがわかります。

フォーマット指定子として呼び出されます

printf もライブラリで定義された単純なメソッドであり、パラメーターに従って値を出力します

例えば

int a = 5;
float b = 5.43 ;

今あなたが書くなら

printf("%d",a);

変数 a ==>> 5 に格納されている整数値を出力します

printf("%f",b);

変数 b ==>> に格納されている float 値を出力します。これは 5.430000 // 最大 6 桁です

コードを試してみると

printf("%f",a);
printf("%d",b);

これらの両方の行は、間違ったフォーマット指定子を使用したため、不明な場所から取得して、ガベージ値と呼ばれる厄介な値を出力します

あなたはリンクを参照することができます

1 : http://www.elook.org/programming/c/printf.htmlでフォーマット指定子のリストを取得

Alok 保存するには:

これは少し複雑です。明確に説明できない場合は、より良い回答で差分質問を作成することをお知らせください。

実際に何が起こるかは、あなたが書くときです

int a = 5 // 101 in binary

次に、メモリ内で2バイト= 16ビットを割り当てます


0000000000000101

しかし、フォーマット指定子として %f を使用して float として出力しようとすると、4 バイト = 32 ビット式が要求されますが、得られるのは 16 ビット表現であり、最も重要な点は、float の 16 番目のビットが ' 用に予約されていることです。 .' それは10進数なので、あなたの


0000000000000101 となります


  1. = 2 進数で 10 // 10 進数で 2

そのため、10 進数の前の値は 5 ではなく 2 になり、float には 10 進数の後の値を表す 16 ビットがまだあり、int 変数は 10 進数の前の値を表すために 16 ビットしか提供しないため、10 進数の値を表す最後の 16 ビットはガベージを選択しますこれらのガベージ値は、ランダムなバイナリ値を表し、最終的に何らかの値になります

したがって、出力は常に 2.something になります

この何かの部分は、ガベージ値を選択するため、マシンごとに異なりますが、10 進数の前の値は、与えられた説明に従って常に同じになります

これが役立つことを願っています

しかし、それが私に知らせない場合

私はより良い表現を考え出すように努めます

また、リンクは非常に役立ちます

于 2013-01-23T15:03:49.013 に答える
1

printf関数のプロトタイプは

int printf(const char * restrict format, ...);

最初の引数は常に、出力の形式を説明するテキスト文字列です(したがって、単にprintf(fruit);. は、フォーマット文字列の後に 0 個以上の追加の引数を取る可能性があることを...示します (これは可変引数関数として知られています)。 printf

残念ながら、可変個引数関数は、引数リストの変数部分で渡される引数の数または型を自動的に認識しません。最後の固定引数の後に、次に使用可能な引数の開始アドレスが表示されるだけです。どうにかしてその情報を固定引数の一部として渡す必要があります。ではprintf、追加の引数の数と型は、書式文字列の変換指定子によって示されます。だからあなたが書くとき

printf("%f\n", fruit);

変換指定子%fは、書式文字列の後printfに型の追加の引数が 1 つあることを示しています。double変換指定子はprintf、表示用に値をフォーマットする方法も指定します。たとえば、

printf("%7.2f\n", fruit);

変換指定子は、小数点以下 2 桁の 7 文字幅のフィールドとして値を表示する%7.2fよう指示します。または. printf9999.99

引数の型が変換指定子と一致しない場合、動作は未定義です。たとえば、次のように書くと

printf("%d\n", fruit);

実際には を渡すときにprintfを期待するように指示していますが、これは論理エラーです。基盤となるアーキテクチャによっては、さまざまなことが発生する可能性があるため、動作は未定義のままであり、コンパイラはそれについて特に何もする必要はありません。どの結果も「正しい」と見なされます。本当に優れたコンパイラは、引数が変換指定子と一致しないという診断を発行します。ほとんどの場合、コードをそのまま変換するだけで、予期しない出力からアクセス違反まで、さまざまな結果が生じる可能性があります。 intdouble

同様に、変換指定子の数に一致する十分な引数を渡さない場合、動作は未定義です。

printf("%f %d\n", fruit);

変換指定子よりも多くの引数を渡すと、追加の引数が評価されますが、それ以外の場合は無視されます。

printf("%f\n", fruit, apples, bananas);
于 2013-01-23T16:00:49.563 に答える
0

%dは、整数を出力するために使用される書式指定子で、%f倍精度の数値を出力します。で使用される引数メカニズムの可変数のため、フォーマット指定子を使用して出力するもののタイプを指定する必要がありますC。これにより、コンパイラーは次の引数のタイプを認識できます。

于 2013-01-23T14:47:33.437 に答える
0

フォーマット指定子は、印刷しようとしていることを"%f"に示す特別な文字列フォーマットです。(詳しくはこちらprintfdouble

フォーマット指定子は、またはを印刷しようとしていることを"%d"に示す特別な文字列フォーマットです。printfdecimalinteger

于 2013-01-23T14:47:33.610 に答える
0

printf変数の型を推測できません。したがって、あなたは彼にヒントを与えます: 形式です。次に、関数は引数を特定の型として解釈できます。

于 2013-01-23T14:48:37.493 に答える
0

4.11 などの数値を 4.110000 にしたくない場合は、%f の代わりに %g を使用できます。%g は %f または %e のいずれかを使用します (この状況では、コンパイラがどちらの方法をより適切に見つけるかを賢く判断します)。これは、数字の末尾にあるゼロを切り取るのにうまく機能します。

Scanf もタイプ セーフではないため、使用するデータのタイプをコンパイラに伝える必要があります。%d と %f の違いもありますが、%f は float のみを参照し、double は参照しません。scanf を使用する場合、%lf は double を参照します。

于 2013-01-23T16:38:24.277 に答える
0

printfの略でprint formatted、次の 2 種類のデータを提供することを意味します。

  • データの表示方法 (フォーマット文字列)
  • 提示するデータ (残り)。

の書式文字列の構文は、printfこの関数をサポートする言語間でほぼ同じです。ウィキペディアには適切な説明があります: Format placeholders

于 2013-01-23T14:50:14.387 に答える