- ベストアンサー
getchar()を int でとる理由がわかりません
今晩は、Cの初心者ですよろしくお願いします。 int ch; ch=getchar(); を使う場合には、「ch」は「char」でなく「int」型でとるのが良いと本には書いていますが、何故かは書かれていません。 この理由はなぜでしょうか。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
#2さんの答えに出ていますが、ようはエラー処理用です。 getchar()からはcharの範囲のデータを取得したいわけですが、Cではこの返り値はエラー処理にも使います。つまり、返り値がcharなのに返り値のひとつをエラー処理用に使うとすると、そのひとつが返ってきたときはエラーと判断され、使えなくなってしまうわけです。 エラー処理用に、charより広い範囲が欲しい・・・というのが返り値にintを使う本質的な理由でしょうね。 ちなみに、'a'と書いたとき、これ実はcharじゃなくてintです。 補足になりますが、ちょっと#2さんの方で誤解を招く表現がありますのでそちらについて一言。 -1はunsigned charとして解釈されるとき、unsigned charの最大値になります。-1って、バイナリレベルで見ればすべてのbitが立った状態ですので、unsignedにすれば最大値になるという寸法です。(ただし2の補数表現の場合。もし負数の表現に関して「1の補数表現」や「絶対値表現」を使っているときは、異なる結果となる可能性もあります) なので、「unsigned charは負数を認識できない」は偽です。しかしいずれにせよunsignedを相手に負数を使うとろくなことがないので、この点は注意するに越したことはありません。 unsigned char uch; uch = -1; /* uch == 255 */
その他の回答 (5)
- Tacosan
- ベストアンサー率23% (3656/15482)
おっと, #5 では「#3 への突っ込み」と書いてしまいましたがこれは間違いで, 正しくは「#4 への突っ込み」です. #3 さん さん, 申し訳ありません.
- Tacosan
- ベストアンサー率23% (3656/15482)
まず getchar は「stdin から 1バイト読み込む」という働きをします. で機能を遡って行くと最終的に fgetc にたどり着きます. そして fgetc は「1文字 (fgetc はバイト指向の関数なのでこれは 1バイトといってもいい) を*unsigned char として*読み込む」という機能を持ちます. もちろん読み込めなければ EOF を返します. つまり, fgetc は (そして getchar も) 「unsigned char で表される値の範囲に加えて EOF (これは定義により負の数) も返す」ことが考えられ, 当然 char を返すわけにはいきません. そういう事情で「int を返す」ことになっています. と, 規格を読めばわかる. 以下 #3 への突っ込み: 「getcharがマルチバイト文字を受け入れる」としても議論は全く変わりません. また, 「変数の領域の確保」についてもそのようになるとは限りませんし, 「char が 8ビット」であることも規格上保障されません.
- nda23
- ベストアンサー率54% (777/1415)
回答が幾つか付いていますが、オマケと思ってください。 先ず、char = 文字、int = 数値 と思っていませんか? よくある間違いなんですが、Cでは両方とも数値です。 違いは精度で、charは8ビット、intは処理系にマッチした精度です。 仮に、getcharがマルチバイト文字を受け入れると、charではダメ ですね。それと、「処理系にマッチした精度」というのはCPUにとり、 最も都合が良い形式という意味でもあります。計算や比較などでは 一時的にint型に変換してから、元の形式に戻すコードが生成される こともあります。 また、変数の領域の確保では境界がこれに合わされます。 例えば、char a, b ; としたら、2バイトの領域を確保したように 感じると思いますが、32ビット機では4バイト境界に位置付けられ るので、メモリは8バイト確保され、先頭にa、+4の所にbが割り 付けられます。残りの3バイトの部分はデッドスペースです。 今時はメモリがフンダンにあるんで、こんな重箱の隅を突くような こと言うと、「貧乏臭い」と笑われますけどね。
- kettachin
- ベストアンサー率40% (2/5)
getcharの仕様で戻り値がint型だからです…というと身も蓋もないので 参考URLの【getchar()が何故 int型変数で受けるのか】をお読み下さい。 処理系によってはchar型が0~255までの値しか取れないので、EOF(=-1) を認識出来ないということらしいです。
- asuncion
- ベストアンサー率33% (2127/6289)
C言語の仕様上、getchar()の戻り値がint型だからです。 >「ch」は「char」でなく「int」型でとるのが良い 取るのがよい、ではなく、取らねばならない、です。