2016-09-25 5 views
0

以下のプログラムは、aがintの場合にa/100の異なる値を出力します。算術式がprintfと矛盾し、別の変数への代入

void main() 
{ 
    int a = -150; 
    float f; 
    f = a/100; 
    printf(" %f,%f ",f,a/100); 
} 

出力:-1.000000,0.000000

ここでは二%f値0.000000まで来るが、どのようにそれが可能であり、それは-1.000000または-1.500000でなければなりません。結果次に1.0

printf(" %f ",a/100); 

プリント(1)が、浮動小数点形式の整数:

f = a/100; 

フロートに格納された整数の除算を実行します

答えて

4

には矛盾がありません。未定義の動作。

これは驚きなしで動作します:あなたが渡す形式を「信じる」するよりも、他の選択肢を持っていない、:

void main() 
{ 
    int a = -150; 
    float f; 
    f = a/100.0; 
    printf(" %f,%f ",f,a/100.0); 
} 

printfは、可変引数関数(void printf(const char *,...)プロトタイプ)です。

あなたは2番目の引数はフロートであることprintfを言えば、それはfloatとして引数のバイトストリームを読みますと、データがfloat構造と一致しない場合は、まあ、それは正常に動作しません。

EDIT:コンパイラメーカーは、これはよくある間違いであることを知っているので、彼らはprintfのような機能のための特別なチェックを追加しました:あなたは、次の明示的なメッセージが表示されます-Wallまたは-Wformatオプションを使用してgccのを使用してファイルをコンパイルした場合:

foo.c:8:1: warning: format '%f' expects argument of type 'double', but argument 3 has type 'int' [-Wformat=] 
printf(" %f,%f ",f,150/100); 

%様フォーマット引数の数および引数の数が一致しない場合と同じになります)。

+0

したがって、キャストしない限り、%fを基になる整数で使用しないでください。 (分かりますが、100.0を分母として使用したくありません)。あなたが言及した変更が完了したら、それが正しく印刷されることを知っていました。私のポイントは、%fフォーマット指定子が使われているときにintを浮動小数点にしていないのはなぜですか? – Bhargav

+0

@iharob:私は何を考えていたのですか?編集しました。さらなる複雑さの必要はありません... –

+0

@Bhargav私の編集を参照してください。 'printf'は知ることができません。 –