- ベストアンサー
getcharの戻り値について
int型で戻る理由、色々調べましたがどうしても理解できません。 理解できない理由は以下です。(ややこしいなぁ。。) (1)「EOFが-1のため」とありますが、ASKIIコードは7bitしか使用しないため、「-1」は「FF」で表現されるし、別に問題ないのではないか? (2)評価時に、int型に変換されるから!(教えてgooの回答)とありますが、評価ってなんですか??CPUで計算する時という意味ですか? 以上の2点です。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
規格上もっとも大きな理由は ・char が符号付きかどうか規定されていない ということではないかな. 「char = unsigned char」である処理系は認められるし, そのような処理系が存在することを前提とすると「getchar で char を返す」ことは不可能です. なお, ちょっと質問者の誤解を解いておくと ・EOF は -1 とは限らない. 規格上は「int型の負の整定数」である. ・実行系で ASKIIコードを使っているとは限らない (EBCDIK だったらどうするんだ) で, EOF が int型の定数であることと組み合わせると getchar の返り値の型は int にしかできないんじゃないかな.
その他の回答 (5)
- titokani
- ベストアンサー率19% (341/1726)
シフトというより、マスクですね。 ただ、このあたりは、最初にCが開発されたCPUに大きく依存する話です。 もし、Cが別のCPUで開発されていたなら、Cの仕様も違っていたものになっていたかもしれませんね。
お礼
ありがとうございます^^ 色々勉強になりました!!
- titokani
- ベストアンサー率19% (341/1726)
どうも、思い込みがあるようで。 本当のところは、intを返す関数よりもcharを返す関数のほうが、「重い」ということです。 なので、intで済むなら、無理にcharを返す仕様にする必要がないのです。 さらに、intを返す仕様なら、EOFも返せて一石二鳥というわけです。
お礼
何度もありがとうございます! 重い理由は、CPUでの計算時にシフトする必要があるからですかね?
- tatsu99
- ベストアンサー率52% (391/751)
全く想像ですが getcと言う関数があります。 これは、任意のストリームから1バイトを読み込み、結果を返す関数ですが、1バイトにはバイナリデータも含まれますので、 戻り値がint型になっています。(そうしないと0xffの入力とデータ終了の-1を区別できないため) それで、本題ですが、 getcharは、ストリームをstdinに限定した、getcと等価であると考えられます。(実際にgetcharはgetcを呼び出しているかも知れません。) そう考えると、intの戻り値にした方が、都合が良かったのではないでしょうか。
お礼
ありがとうございます! でも、想像ではなくて事実が知りたかったので… ちょっとgetchar()のソースでも見てきます!
- titokani
- ベストアンサー率19% (341/1726)
>文字ならばcharで良いじゃないのかなぁ。っていう考えはおかしいでしょうか? 確かにcharでもいいですが、intでもいいですよね。
お礼
再度、ありがとうございます>< >確かにcharでもいいですが、intでもいいですよね。 となると、int型で戻る理由にはならないんですよね。。
- titokani
- ベストアンサー率19% (341/1726)
というか、逆ですね。 charにする理由がないから、intなのです。
お礼
早速の解答ありがとうございます。 文字なのに。ですか? 文字ならばcharで良いじゃないのかなぁ。っていう考えはおかしいでしょうか?
お礼
ありがとうございます!! やっと理解(というか納得?)できました!! 本当にすっきりしたー!