0

コード スニペットの o/p:

printf("%f", 9/5);
  1. 私のLinux gcc 4.6.3(gcc myprog.cの後に./a.out):

    -0.000000

  2. codepad.org で:

    2.168831

違いはなぜですか?

リンクを参照しました:なぜ printf でキャストが必要なのですか? Cでの暗黙の変換?、しかし、それを利用できませんでした。

コードパッドの実行に関する情報: C: gcc 4.1.2 フラグ: -O -fmessage-length=0 -fno-merge-constants -fstrict-aliasing -fstack-protector-all

編集:詳細:(同じプログラム内の)コードパッドでのフォローの実行用

printf("%f\n", 99/5);
printf("%f\n", 18/5);
printf("%f\n", 2/3);
printf("%f\n%f\n%f", 2, 3, 4);
printf("%f\n", 2);

o/p は

2.168831
2.168831
2.168831
0.000000
0.000000
-0.001246
-0.0018760.000000

最初の 3 つの出力は同じガベージ値です (最後の出力ではありません)。なぜだろうか。

4

3 に答える 3

4

9/5 は .. と見なされ、フォーマット指定子( double が必要)intを使用すると、出力が未定義になります。%f

正しい結果を印刷するには、次のようにします。

printf("%f", 9.0/5); // forces system to make sure that the argument is not treates as int

また

printf("%f\n",(double)9/5); // type casting the argument to a double .. this is more helpful 
                            // in case you have a variable

codepad.org がコードをどのようにコンパイルするかはわかりませんが、gcc の場合、printf がフォーマット指定子と一致するように正しい引数が必要です。


これをより注意深く確認するには、次の点を考慮してください。

#include <stdio.h>
int main(){ 
    printf("%f %d %f\n",9/5,9/5,9.0/5);
    printf("%f\n",1); // as suggested by devnull-again since the argument is not a double
                      // the output is undefined
    return 0;
}

出力:

$ ./test
0.000000 1 1.800000
0.000000
于 2013-11-10T11:23:55.310 に答える
1

これは未定義の動作であり、何でも印刷できます。9/5のタイプはintです。aを渡す%f 必要がありdoubleます ( a を渡すと、可変引数関数呼び出しへの引数の自動昇格のおかげで にfloat変換されるため、それも問題ありません)。double

ダブルを与えていないので、何でも起こり得ます。

実際には、 と を仮定するsizeof(int)==4sizeof(double)==8、printf 呼び出しは 4 バイトのランダムなガベージを読み取ります。それがすべてゼロの場合、ゼロを出力します。そうでない場合は、ランダムなものを印刷します。

于 2013-11-10T11:24:07.507 に答える