- ベストアンサー
結果がおかしい
ソフトはvisual C++を使ってます。 C言語を本で勉強してて次のようなソースファイルを作ってコンパイルして、実行しました。この場合、結果は 105と表示されると思うのですが、0と表示されます。なぜなのか教えてください。 #include<stdio.h> int main() { printf("%d\n",100*1.05); return(0); } 結果 0
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
>すみませんが、後学のためにあきらかにまちがいの根拠を教えて下さい。 >ANSI-Cでそこまで定義してあるものなのでしょうか? はい。ANSI-Cの日本における翻訳規格である JIS X 3010の付属書Gにおいて、 「fprintf又はfscanf関数の書式が実引数並びと一致しない場合」 は「未定義」であるとされています。 未定義というのは、要するにプログラムとしてまちがいということです。 だから、コンパイラによってたまたま四捨五入になることがあってもかまいませんが、 C言語の参考書において「四捨五入になる」という記述はまちがいです。
その他の回答 (8)
- JaritenCat
- ベストアンサー率37% (122/322)
ANo.6です。 liar_adan さん、丁寧な解説ありがとうございました。 JIS X3010で「未定義」と定義されているんですね。。 ANSI-C準拠でないコンパイラならあり得る話なので、規格がどうか知りたかったのです。すっきりしました。 ヘンな話題を振ってしまってごめんなさい>質問者の方
- liar_adan
- ベストアンサー率48% (730/1515)
なお、printf関数の所には、 "stdoutに出力するfprintfと同じ" という意味のことが書いてあるので、 fprintfに関する記述はprintfにも適用されます。
- JaritenCat
- ベストアンサー率37% (122/322)
ANo.5さんへ >すみませんが、後学のためにその本の題名を教えてください。 >printfに関してその記述はあきらかにまちがいです。 >確認してみたいと思います。 すみませんが、後学のためにあきらかにまちがいの根拠を教えて下さい。ANSI-Cでそこまで定義してあるものなのでしょうか?
- liar_adan
- ベストアンサー率48% (730/1515)
>本には浮動小数点値を%dで出力した場合、少数第1位を四捨五入して出力されると書いてあったので、 すみませんが、後学のためにその本の題名を教えてください。 printfに関してその記述はあきらかにまちがいです。 確認してみたいと思います。
- kmb01
- ベストアンサー率45% (63/138)
0が出力されるのは、 105.0を16進表記すると、0x40 5A 40 00 00 00 00 00 %dによりこれの後半4バイト00 00 00 00を評価する(リトルエンディアン)ので0が出力されるのだと思います。
- JaritenCat
- ベストアンサー率37% (122/322)
100*1.05の計算は、整数定数×小数定数なので、int*doubleとなり、int→doubleに型変換されてdouble*boudeで計算されます。 printfの中が"%d"なので、整数(int)として表示させようとしますので、intとdoubleのサイズの違いから0が表示されたものと思います。 100をもっと大きな数にしてやれば、0ではなく他の数字が出てきます。 printf("%g\n",100*1.05); なら105と表示されるでしょう。
- UMTS
- ベストアンサー率25% (3/12)
#1さんの回答通りキャストすれば良いでしょう。 その他、%d→%fに変更し実数で表示するってのも有りかと。 ただ、%dに実数を渡した場合の挙動、この場合で言う"0"になる理由と言う事になると『Ansi-C』に定義されてあったかどうか覚えてません...汗
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
浮動小数点値を %d で出力しようとしているからでしょう。 printf("%d\n",(int)(100*1.05)); ではいかがですか?
補足
本には浮動小数点値を%dで出力した場合、少数第1位を四捨五入して出力されると書いてあったので、浮動小数点値を%dで出力しました。 printf("%d\n",(int)(100*1.05)); は確かに105と出力されました。 ありがとうございます。
お礼
気になっていたことを解決していただきありがとうございました。
補足
本の名前は C言語プログラミングの初歩の初歩 西村広光著 技術評論社 です。 よく考えてみたら、「実数をint型の変数に記憶させたときには、少数点以下は四捨五入されます。」と記述してあり多少誤解していたように思いました。 しかしこの本の中のP61の参照プログラムに printf("10000:%d\n",10000-(12*9+15*7)*1.05) とあるので、筆者も誤解されているのではと感じました。