• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語初心者です。次の問題で質問です。)

C言語初心者です。お釣り計算の問題で負の値になってしまう理由は何ですか?

このQ&Aのポイント
  • C言語初心者です。お釣り計算の問題で負の値になる理由を教えてください。
  • printf関数でintのキャストを入れるとお釣り計算が成功するのですが、入れない場合は負の値になってしまいます。
  • 回答お願いします。なぜお釣り計算が負の値になるのか説明してください。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

printfの中の%と、それに対応する引数の型は一致させる必要があります。 この対応が間違っていた場合、期待通りの出力にはなりません。 %dに対応する型はintです。 キャスト無しだと、暗黙のキャストによって、double taxに合わされて、(money-(drink+2*milk)*tax)が全体でdoubleになります /* (drink+2*milk) がすべてint同士の計算なのでint → int * doubleは、int→doubleの暗黙のキャストが発生して (drink+2*milk) *tax はdouble → int - doubleは、int→doubleの暗黙のキャストが発生して money-(drink+2*milk) *tax はdouble となります */ このとき printf("お釣りは%dです。",(money-(drink+2*milk)*tax)); とすると、引数を受け渡すときに、double 型の値がメモリに書き込まれます(スタックに積まれます)。 double型の内部表現は、int型とはまったく違うので、1と1.0のような「同じ値」でも、メモリの内容はまったく違うものになります。 printfでは、 %d で引数の領域から値を取ってきますが、このときに型を判断するのは、呼び出したときの型ではなく、%d等の書式に対応した型です。%dの場合は、sizeof(int)分をメモリから取ってきて、intだと解釈します。 先に書いたように、内部構造がまったく違うので、double(の一部)をintと解釈すれば、まったく違う値になってしまいます。 対処法は、%と引数の型を対応させることです。 %dなら相手はintに doubleを使いたいなら、%f等に この不一致は、C言語の仕様上、エラーにはなりません。 コンパイル時に、警告を多く出すように設定した場合に、「警告」になるコンパイラはあります。が、警告はエラーでは無いので一応「正常にコンパイル」できます(警告をエラーにするオプションが、コンパイラにある場合もあります) 警告レベルを上げて、間違えないように注意するしかありません。

その他の回答 (3)

  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.4

#include<stdio.h> int main(void) { printf("おつりは%d円\n", 1000 - (int) ((198 + 138 * 2) * 1.05)); return 0; }

  • KEIS050162
  • ベストアンサー率47% (890/1879)
回答No.3

#1さんの指摘の通りです。 %d を %f にすると浮動小数点表示になります。 蛇足ですが、色々やってみました。 1)浮動小数点のまま表示する printf("お釣りは%fです。\n",(money-(drink+2*milk)*tax)); 2)浮動小数点をINTにキャストする(質問者殿の例) printf("お釣りは%dです。\n",(int)(money-(drink+2*milk)*tax)); 3)整数型のみ使う (105倍して100で割る。小数点以下切捨て) printf("お釣りは%dです。\n",money-((drink+2*milk)*105)/100); 4)整数型のみ使う (四捨五入) printf("お釣りは%dです。\n",money-((drink+2*milk)*105+50)/100); 5)整数型のみ使う誤った例。丸めの誤差が大きくなる例。 printf("お釣りは%dです。\n",money-(drink+2*milk)*(105/100)); ご参考に。

  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.1

>(money-(drink+2*milk)*tax) ここで、double のtax を計算しているために、結果がdoubleになっています。 それを、%dで整数表示したためです。

関連するQ&A