6 に答える
printf("%f",9/5);
引数は type でなければならず、 typeであるため、このステートメントは未定義の動作です。double
9 / 5
int
9 / 5.0
型の引数double
(および正しい浮動小数点除算)を持つために使用します。
9/5
タイプint
です。withにint
引数を渡すと、未定義の動作になります。printf
"%f"
9.0/5.0
必要に応じて1.800000
、または(double)(9/5)
必要に応じて試してください1.000000
どうしてこれなの?
したがって、9 / 5 は 2 つの整数を除算することで得られます。2 つの整数を除算すると、整数値 1 になります。しかし、これは int であり、%f
指定されたものは float を必要とするため、これは未定義の動作です。
Ps .: おそらく欲しい
9.0 / 5
また
9 / 5.0
また
9.0 / 5.0
Re:プログラムの出力が 1.000000 であってはいけませんか?
除算の結果が ではなく float 値になっていましたint
。形式を指定int
して を印刷しようとしたため、結果は未定義の動作でした。%f
詳細:
ただし、関連する2つの問題があります。
int
除算から eger 結果を取得していますが、 float 値のフォーマットを使用して試行しています%f
(あなたの質問は、あなたがこれを認識していることを暗示しているようです)整数除算は整数になるため、
%f
フォーマット指定子が適切ではありません。書式指定子と引数が一致しない場合の動作はundefinedです。整数の結果を避けるには、次を試してください。
9.0 / 5
または9 / 5.0
または9.0 / 5.0
期待していた結果を得るには、指定子
%f
が適切であり、期待どおりに機能します。整数除算を行っている場合、結果は別の整数になることに注意してください。ただし、少なくとも 1 つのオペランドが float の場合、もう 1 つのオペランドも float に昇格され、除算の結果は float 値になります。
整数除算では切り捨てが発生します。つまり、結果の小数部分が破棄されます。
答えは簡単です。9 は整数で、5 も整数です。整数が整数で除算されると、結果は 0 になり、printf() で「%f」を使用したため、0.00000 にエスカレートされます。正しい結果が必要な場合は、9.0/5 を実行してください。これで、確実に正しい結果が得られます。答え
これは9/5
が 1 であり、整数型であるためです。小数部分は単純に切り捨てられます。5.0/9
目的を達成するには、または5/9.0
または5.0/9.0
またはを使用して除算を強制的に浮動小数点演算にします。(float) 5/9
整数引数の型が にバインドされている%f
場合、動作は未定義です。
これは、C99 標準のセクション 7.21.6.1 パラグラフ 9 に記載されています。このパラグラフは以下に引用されています。
変換指定が無効な場合、動作は未定義です。対応する変換指定に対して正しい型でない引数がある場合、動作は未定義です。