2

次のコードがあります。

double dtemp = (some value)
printf("\n***Hand washing: cost per kg/item: %.2f, cost: %.2f.\n", 5, dtemp);

次のように出力されます。

***手洗い: 1 kg/アイテムあたりの費用: 0.00、費用: 0.00.

そして、定数 5 を 5 を保持する double 変数に変更すると、(入力に従って) 次のように出力されます。

***手洗い: 1 キログラムあたりの費用: 5.00、費用: 20.00。

定数 5 が dtemp の評価に影響するのはなぜですか? 私は gcc 4.6.2 (MinGW) を使用しており、TCC でもテストしました。

4

3 に答える 3

8

f変換指定子は、関数でdouble使用する場合に を必要printfとし、 を渡しますint。を渡すintと未定義の動作になります。つまり、何でも起こり得るということです。

于 2012-07-08T11:17:06.247 に答える
7

私のコンパイラ(gcc 4.4.3)の警告メッセージはこれを説明しています:

   format ‘%.2f’ expects type ‘double’, but argument 2 has type ‘int’

intフォーマット文字列で指定された ( )とは異なるタイプの値 ( ) を渡しているdoubleため、この不一致により動作は未定義です

ご覧のとおり、これを調整して一貫性を持たせると、期待どおりの出力が得られます。すなわち、

/* provide a double value */
printf("\n***Hand washing: cost per kg/item: %.2f, cost: %.2f.\n", 5.0, dtemp);

出力:

***Hand washing: cost per kg/item: 5.00, cost: 3.14.

また

/* specify an integer value in the format string */
printf("\n***Hand washing: cost per kg/item: %d, cost: %.2f.\n", 5, dtemp);

出力:

***Hand washing: cost per kg/item: 5, cost: 3.14.

コンパイラの警告レベルを上げてから、すべての警告を追跡し、無視できるものと無視できないものについて慎重に決定することを常にお勧めします。

于 2012-07-08T11:18:11.180 に答える
0

e printf 関数の最初のパラメーターは文字列です。%d ごとにチェックし、次にポイントを移動します。例: %d,move 4 len; %lld move 8. int64_t a = 1;int b = 2; printf("%d, %d\n", a, b); 答えは 1,0 です。2 つの %d は下位 4 バイトと上位 4 バイトを取得するためです。

printf("\n***手洗い: 1 kg/アイテムあたりのコスト: %.2f, コスト: %.2f.\n", 5, dtemp); sizeof(doubel) = 8 なので、printf 関数は 0x0000000000000005 を取得します。

お役に立てば幸いです。

于 2012-07-08T11:41:44.827 に答える