int main(void) {
int i = 0;
scanf("%f", &i);
return 0;
}
浮動小数点数を入力すると、折りたたまれると言われています。
Gcc4.7で睾丸を持っていますが、動作します。私は VC6.0 を持っていないので、VC6.0 で崩壊するかどうか知りたいです。
もしそうなら、なぜですか?FPUが初期化されていないからと言われましたか?
int main(void) {
int i = 0;
scanf("%f", &i);
return 0;
}
浮動小数点数を入力すると、折りたたまれると言われています。
Gcc4.7で睾丸を持っていますが、動作します。私は VC6.0 を持っていないので、VC6.0 で崩壊するかどうか知りたいです。
もしそうなら、なぜですか?FPUが初期化されていないからと言われましたか?
int i = 0;
scanf("%f", &i);
あなたがしたい:
scanf("%d", &i);
代わりは。
%f
inscanf
は、 へのポインタ型の引数を想定していますfloat
。型ポインタの引数を渡すことint
は、未定義の動作です。
このコードにより、未定義の動作が発生します。
それが機能する場合、あなたは (不幸) 幸運です。動作を保証するものではありません。失敗するか、動作する可能性があります。
printf
形式指定子がおよびに渡される実際の型と一致することを確認するのは、ユーザーの責任ですscanf
。の実際の型は でi
あるint
ため、適切な書式指定子は である必要があります%d
。
scanf("%d", &i);
これは、コンパイラが浮動小数点を使用していることを検出しない限り(または強制するために特別なコンパイラオプションを使用しない限り)、コードに浮動小数点関数を持たないマイクロソフト(およびボーランド、おそらく他の)コンパイラの古いバージョンを指していると思います。このコードが合理的な方法で機能することは絶対にないため、これはかなり無意味な例です。浮動小数点値を整数に本当に詰め込みたい場合は、型パニング ポインター キャストまたは共用体を使用するのが「承認された」方法です。
汎用関数 (*printf や *scanf など) の浮動小数点サポートは通常、メインの標準ライブラリで提供されており、正しく記述されたコードには問題がないため、最近ではあまり関係がありません。
printf で %f (または %g) を使用する場合も、同じ問題が当てはまると思います。