• ベストアンサー

結果がおかしい

ソフトはvisual C++を使ってます。 C言語を本で勉強してて次のようなソースファイルを作ってコンパイルして、実行しました。この場合、結果は 105と表示されると思うのですが、0と表示されます。なぜなのか教えてください。 #include<stdio.h> int main() { printf("%d\n",100*1.05); return(0); } 結果 0

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

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.7

>すみませんが、後学のためにあきらかにまちがいの根拠を教えて下さい。 >ANSI-Cでそこまで定義してあるものなのでしょうか? はい。ANSI-Cの日本における翻訳規格である JIS X 3010の付属書Gにおいて、 「fprintf又はfscanf関数の書式が実引数並びと一致しない場合」 は「未定義」であるとされています。 未定義というのは、要するにプログラムとしてまちがいということです。 だから、コンパイラによってたまたま四捨五入になることがあってもかまいませんが、 C言語の参考書において「四捨五入になる」という記述はまちがいです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (8)

回答No.9

ANo.6です。 liar_adan さん、丁寧な解説ありがとうございました。 JIS X3010で「未定義」と定義されているんですね。。 ANSI-C準拠でないコンパイラならあり得る話なので、規格がどうか知りたかったのです。すっきりしました。 ヘンな話題を振ってしまってごめんなさい>質問者の方

全文を見る
すると、全ての回答が全文表示されます。
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.8

なお、printf関数の所には、 "stdoutに出力するfprintfと同じ" という意味のことが書いてあるので、 fprintfに関する記述はprintfにも適用されます。

全文を見る
すると、全ての回答が全文表示されます。
回答No.6

ANo.5さんへ >すみませんが、後学のためにその本の題名を教えてください。 >printfに関してその記述はあきらかにまちがいです。 >確認してみたいと思います。 すみませんが、後学のためにあきらかにまちがいの根拠を教えて下さい。ANSI-Cでそこまで定義してあるものなのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.5

>本には浮動小数点値を%dで出力した場合、少数第1位を四捨五入して出力されると書いてあったので、 すみませんが、後学のためにその本の題名を教えてください。 printfに関してその記述はあきらかにまちがいです。 確認してみたいと思います。

manicool
質問者

お礼

気になっていたことを解決していただきありがとうございました。

manicool
質問者

補足

本の名前は C言語プログラミングの初歩の初歩 西村広光著 技術評論社 です。 よく考えてみたら、「実数をint型の変数に記憶させたときには、少数点以下は四捨五入されます。」と記述してあり多少誤解していたように思いました。 しかしこの本の中のP61の参照プログラムに printf("10000:%d\n",10000-(12*9+15*7)*1.05) とあるので、筆者も誤解されているのではと感じました。

全文を見る
すると、全ての回答が全文表示されます。
  • kmb01
  • ベストアンサー率45% (63/138)
回答No.4

0が出力されるのは、 105.0を16進表記すると、0x40 5A 40 00 00 00 00 00 %dによりこれの後半4バイト00 00 00 00を評価する(リトルエンディアン)ので0が出力されるのだと思います。

参考URL:
http://msugai.fc2web.com/java/binary.html
全文を見る
すると、全ての回答が全文表示されます。
回答No.3

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)
回答No.2

#1さんの回答通りキャストすれば良いでしょう。 その他、%d→%fに変更し実数で表示するってのも有りかと。 ただ、%dに実数を渡した場合の挙動、この場合で言う"0"になる理由と言う事になると『Ansi-C』に定義されてあったかどうか覚えてません...汗

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

浮動小数点値を %d で出力しようとしているからでしょう。 printf("%d\n",(int)(100*1.05)); ではいかがですか?

manicool
質問者

補足

本には浮動小数点値を%dで出力した場合、少数第1位を四捨五入して出力されると書いてあったので、浮動小数点値を%dで出力しました。 printf("%d\n",(int)(100*1.05)); は確かに105と出力されました。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • コンパイル結果が違う

    コンパイル結果が違う C言語を勉強中の初心者です。 以下のプログラムをVC++6.0のCL.exeでコンパイルするとうまくいくのですが、VC++2010のCL.exeでコンパイルして実行すると、t2の値が0になってしまいます。 また、VC++2010でコンパイルした方が実行結果も遅いです。 #include <stdio.h> #include <time.h> int main(void) { int i = 1; time_t t1, t2; time(&t1); while(i <= 30000) printf("%d,", i++); time(&t2); printf("\ntime1=%ld time2=%ld\n", t1, t2); printf("かかった時間は、%d秒です\n", t2-t1); return 0; } vc++2010でコンパイルした方のt2の値が、0で表示されてしまうのはなぜでしょうか? よろしく、お願いします。

  • Visual C++ 2008 Express Edition

    Visual C++ 2008 Express Editionをダウンロードしたのですが、使い方が全く分かりません。C言語を学習しています。 例えば #include <stdio.h> int main(void) { printf("Hello, World!\n"); return 0; } というようなプログラミングを実行するにはどうすればいいでしょうか

  • C言語で乱数がうまく効きません。下記のソースでコンパイルして実行すると

    C言語で乱数がうまく効きません。下記のソースでコンパイルして実行すると結果が130固定となってしまいます。 #include <stdio.h> #include <stdlib.h> int main(void){ int x; x = rand(); printf("%d",x); return 0; } 使っているコンパイラはBorland C++ 5.5.1です。何か間違いでもあるのでしょうか?よろしくお願いします。

  • 実行結果の順番がおかしいんです・・・・・(。。;)

    現在C言語の勉強をしている初心者です。突然ですが 例えば、このようにプログラムしたら・・・ #include <stdio.h> int main(void) { int n; printf("何か数字を入力してください:"); scanf("%d",&n); printf("\n入力した数字は%dです。\n",n); return 0; } <<実行結果>>  何か数字を入力してください:2 [Enter]  入力した数字は2です。 って普通は出力されますよね??しかし、私の使っているBorland C++ Compiler 5.5 では <<実行結果>>  2 [Enter]  何か数字を入力してください:  入力した数字は2です。 っていう風に、まず、なにか入力しないとprintfの内容を出力してくれないんです。(汗)これって実行結果の順番がおかしいですよね・・・(。。;) どうかこの状態を直せるアドバイスをください。 よろしくお願い致します。m(__)m

  • C言語でscanf()が先に実行されるのはなぜですか?

    C言語でscanf()が先に実行されるのはなぜですか? #include <stdio.h> int main(void){ int intNum; printf("整数を入力してください:\n"); scanf("%d", &intNum); printf("入力値は:%d\n",intNum); return(0); }

  • コンパイルすると‥‥

    C言語です。 emacsでC言語のプログラムを作りました。 #include<stdio.h> int main() { float x; printf("データを入力してください\n"); scanf("%f",&x); printf("%fを受け取りました\n",x); return 0; } といった簡単なプログラムです。 これをコンパイルすると 画像のようなものが表示されて どうしたら良いのか困ってます。 僕が思うにもはやプログラムに問題があるのではなく パソコンの設定に問題があるのかな? と思っているのですがどうしたら良いのかがわかりません。。。 分かる方、よろしくお願いします。

  • 配列要素内の数値

    #include <stdio.h> int main(void) { int arr[1]={123456789}; int *x[1]; *x = arr; printf("%d ",*(x[0])); /* 123456789 と表示*/ return 0;} 実行すると123456789と表示されるまでは分かるのですが、*(x[0])の部分を別の書き方にして、arr[0]に入ってある「123456789」という数値の千の値である6という数値のみを取り出して、表示することは可能なのでしょうか?(6000と取り出したいのではなく、6として取り出したい) 次のように数値を文字列の一つ一つを扱うかのように、扱いたいのです。*(x[0])の部分の変更だけで6を取り出せるような方法はありますか? #include <stdio.h> int main(void) { char *arr[]={"pen"}; printf("%c\n",*(arr[0]+0)); printf("%c\n",*(arr[0]+1)); printf("%c\n",*(arr[0]+2)); return 0;}

  • int とcharの使い方と違い

    教えてgooに投稿するのは初めてですがよろしくお願いします。 最近C言語を勉強し始めた初心者です。 ネットのサイトを見て独学でしています。 過去スレッドをさらっと見て聞きたいことが書いてなかったので投稿します。(同じスレッドがあったらすみませんOTL) #include<stdio.h> int main(void) { int str='a'; printf("str=%c\n",str); return0; } この上のプログラムでは str=a と出て、エラーが出ずにコンパイル出来ました。でも、 #include<stdio.h> int main(void) { int str[]="abc"; printf("str=%s\n",str); return0; } とするとエラーが出ます。 int とcharの使い方と違いについて詳しく教えてほしいです>< お願いします。

  • 学校の授業でC言語をやっているので「猫でも分かるC言語プログラミング」

    学校の授業でC言語をやっているので「猫でも分かるC言語プログラミング」を買ったのですが、 下記のソースを実行しようとしても「'a' :仮パラメーター リスト内にありません」とエラーが出てしまいます。 プログラミングに関してはど素人なので何をどうすればいいのかまったく分かりません。もしよければ誰か助けてください! ちなみにMicrosoft visual C++ 2010を使っています #include <stdio.h> int main() {     int a, b, c; a = 10; b = 15; c = a + b; printf("%dたす%dは%dです\n", a, b, c); return 0; }

  • いきなり。

    C言語をやってます。中学3年です。始めたばっかの初心者なんですが、ビルドエラーが出たのでどこが悪いのか教えていただきたいです。 #include <stdio.h> int main() { printf("今日はよい天気ですね。\n明日もよい天気でしょう\n"); return 0; } これなんですが、ビルドエラーが2つ出ました。 Visual C++を使ってます。 よろしくお願いします。