- 締切済み
printfについて
printfで void main() { int n=0.1; printf("%g",n); } と入力したのですが、 出力結果が-5.34432e+226と出たのですが、なぜなのでしょうか?
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- tatsu99
- ベストアンサー率52% (391/751)
>出力結果が-5.34432e+226と出たのですが、なぜなのでしょうか? どのような結果がでることを期待されたのでしょうか?
- S117
- ベストアンサー率40% (18/45)
printf この関数ほど参考書でしっかりとした解説を伴わず使わされるものもないでしょう。 この関数は使い方を誤れば容易にアクセス違反を起こします。開発環境が不明ですが、とりあえず付属のライブラリ解説書から該当関数の仕様に目を通してください。 これのプロトタイプは int printf(const char *format, ...); とされますが、後ろの...はコンパイル時に第2引数以降の型チェックを行わないことを意味しています。 そして、実行時に渡された文字列を評価することで、「そこに書式で指定された型の値があることを期待して」値を読み取って文字列として出力します。 通常の関数であれば、intの引数をとるのであれば、int以外のintに暗黙にキャスト可能な値であれば暗黙にキャストしますが、printfのような関数では、コンパイラは第2引数以降が何であるのか知らないのです。 よってキャストはされません。 この辺の仕組みを詳しく知りたいのであれば、「可変個の引数」を調べるといいでしょう。 余談: void main()じゃなくて int main(void) { /*...*/ return 0;} としておく方がいろいろ安心です。
int型の変数に0.1を代入したら、変数の中身はどうなると思いますか? その変数をdouble型と判定して出力するとどうなると思いますか? その変数が格納されているメモリ上のデータ以降もデータとして引っ張り出そうとするから、そういう結果になるのですよ。