2

同じ出力を生成すると予想される 2 つのプログラムで異なる結果が表示されます。最初のケースです。

int money;

printf("Enter the price of the car: ");
scanf("%d", &money);

printf("\nResult: %d .\n", money+money*0.4);

2番目のケース:

int money;

printf("Enter the price of the car: ");
scanf("%d", &money);

money=money+money*0.4;

printf("\nResult: %d .\n", money );
return 0;

最初のケースでは の結果はありprintfます0が、2 番目のケースではそうではありません。これらの異なる結果が表示されるのはなぜですか?

4

3 に答える 3

7

%dフォーマット指定子はintprintf渡していることを示していますが、最初のケースではdoubleを渡していますが、これも未定義の動作であるため、結果は信頼できません。結果として:

money+money*0.4

のような接尾辞が付いていない限り、浮動定数doubleであるためdoubleであり、乗算加算の結果は、両方の演算が対象となり、 の値がに変換される通常の算術変換により、同様にdoubleになります。操作には2 倍です。fmoney

2 番目のケースでは、正しくintを渡しており、結果を に代入しているためmoney:

money=money+money*0.4

double値を切り捨てます。使用しているコンパイラはわかりませんが、警告フラグがなくても、両方とも間違ったフォーマット指定子について警告します。たとえば、clang次のように述べています。gccgcc

警告: フォーマット '%d' は 'int' 型の引数を想定していますが、引数 2 は 'double' 型です [-Wformat]

したがって、その行に対して警告が表示されない場合は、警告レベルを高く設定することを検討する必要があります。

完全を期すために、ドラフト C99 標準セクション7.19.6.1 の fprintf 関数printfは、書式指定子に関してもカバーしています。段落9では、次のように述べています。

変換指定が無効な場合、動作は未定義です。248)引数が対応する変換仕様の正しい型でない場合、動作は未定義です。

于 2013-10-28T11:46:46.977 に答える
3

7 行目の乗算を確認します。

最後の行を次のように変更できます。

float price = money * 1.4;
printf( "\nResult %f.\n", price);
于 2013-10-28T11:49:04.790 に答える
1

money+money*0.4暗黙的moneyに double にキャスト%dされるため、その値に対して間違った書式指定子が作成されます。

于 2013-10-28T11:46:35.463 に答える