Endowsの日記: Endows の へっぽこプログラマ日誌 第3回 2
日記 by
Endows
ちょっと友人に指摘されたことがあってテストプログラムを書いてみた。まあ、本で調べてもいいんだけど、実際にテストする方が手っ取り早かったので。
ソースコードは以下の通り。
#include<stdio.h>
#define TEST1 (8/3)
#define TEST2 (8./3.)
int main(int argc, char *argv[]){
double ans1, ans2;
ans1=TEST1;
ans2=TEST2;
printf("%E,%E\n",ans1,ans2);
return 0;
}
んでコンパイル、実行してみると、出力は次のようになりました。
2.000000E+00,2.666667E+00
ということで、あいかわらずのへっぽこぶりを発揮した一件でした。
(上のテストプログラムと実行結果を見れば、何をミスったかは分かりますよね?)
ソースコードは以下の通り。
#include<stdio.h>
#define TEST1 (8/3)
#define TEST2 (8./3.)
int main(int argc, char *argv[]){
double ans1, ans2;
ans1=TEST1;
ans2=TEST2;
printf("%E,%E\n",ans1,ans2);
return 0;
}
んでコンパイル、実行してみると、出力は次のようになりました。
2.000000E+00,2.666667E+00
ということで、あいかわらずのへっぽこぶりを発揮した一件でした。
(上のテストプログラムと実行結果を見れば、何をミスったかは分かりますよね?)
指摘した本人より (スコア:1)
この前の指摘は、(8/3) = 2になることは自明なのでさておいて、(8/3)*10.5のような場合、うっかり8/3の結果も自動型上げされると思い込んでしまうけどそれは間違い、といったものだったんだけど…
は、=の左右で型調整を期待してしまうのか?
/* ま、どちらにせよ間違いだけど。
話題がCなので、Cスタイルのコメントで。 */
というわけで、へっぽこがここにももう一人…
巧妙に潜伏したバグは心霊現象と区別が付かない。
Re:指摘した本人より (スコア:1)
あ、そうか。そういえばその辺も勘違いの原因になっていたのか。(って、自分が気づいていなくてどうする)
今回の教訓は『式全体で型上げしてくれるわけではない』ということで OK ですかね?
というわけで、レポートも一部修正しなければなりませんでした。まだ締切が十分先だったのが救いかな…?