• ベストアンサー

引き数がポインタでない関数の戻り値はなぜint型なのか?

最近、疑問に思っていることがあって質問したいんですが、一般的にc言語 で使われる関数っていうのは、引き数としてポインタをとる関数以外は全て 戻り値はint型なのですがこれはなぜでしょう。私自身の結論としては、も し関数の戻り値がchar型だとしたらchar型で表せる範囲の値は全てasciiコー ドとして使われているので、もしエラーがあって戻り値としてEOF(-1)を返す 際に1byteでは同じビット配列になる255が既に使われていてEOFとして-1を定 義できないために、-1と255が同じビット配列ではない1byte以上のデータ型 つまりint型(たぶん、int型がコンピュータが一番効率良く処理できるデータ型なのでたぶんint型を使ったと思いますが)を使ったのではないかと言う 結論に達したのですがこれは正しいのでしょうか。どなたか御教授お願い致 します。

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

「一般的」とあるのは、「標準ライブラリが大体そうなっているから」と いうことですよね。 今の C というのは ANSI というところで定められた規格に則っているもの がほとんどなんですが、その規格以前から C はありました。そのときには void という型が無かったので、特に関数の戻り値が必要ではない関数でも 何か戻り値を指定する必要がありました。なので、 > int型がコンピュータが一番効率良く処理できるデータ型なので という判断は、ある意味正しいです。 また、char型云々の話は、fgetc() の戻り値が int である理由として 良く言われることです。 ただ、「一般的に」の範囲次第なのですが、そうではない関数も 標準としてあります。例えば、メモリの動的割り当てを扱う malloc() は void* ですし、それで獲得したメモリの開放を行う free() は void です。 また、成功した/しないだけが分かれば十分な関数では、いわゆる「論理型」 と呼ばれる型で十分なのですが、ちょっと前の C の規格では、その型が無い ので、効率よく扱える int を戻り値にしている、ということもあります。 ぐだぐだ書きましたが、int が整数を効率的に扱える型だから、という 考え方は概ねあっています。

その他の回答 (4)

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.5

Cでは式の評価時に「char,shortはintへ」、「unsigned char,unsigned shortはunsignedへ」、「floatはdoubleへ」と暗黙の格上げが行われます。 よって、「関数値としてのcharやshort」は無意味です。 long, unsigned long, long doubleを返す関数は存在します。 EOFの取り扱いについては“そういう面もある”という程度です。

  • itohh
  • ベストアンサー率45% (210/459)
回答No.4

こんにちは。itohhといいます。 たまたま、あなたが見たソースがint型の関数だけだったのでしょう。 標準の関数でもいろいろな型で返していると思うのですが... (例えば、malloc関数はvoid*型ですよね。それに、strcat関数なんかはchar*型です) ユーザが作成する関数では、自分で作った構造体のポインタを返すとかもあります。 その時々にあった型(int,long,BOOLや構造体のポインタ)を返すことが出来ます。(使い分けなければいけない!!) 蛇足ですが、コンピュータに一番効率が良く処理が出来るデータ型はOSによって変わってきます。(int型もあれば、long型もあります。)

  • xinman
  • ベストアンサー率30% (25/83)
回答No.3

shigatsuさんもおっしゃられているとおり「一般的にC言語で使われる関数」が何であるのかをハッキリさせていただきたい。 算術関数(math.hをインクルードすると使えるようになる奴ら)なんかはdouble型の戻り値をとりますし、「一般的にC言語で使われる関数」とは具体的にはどのような関数を指しているのでしょうか? 補足要求ですが一応回答を >int型がコンピュータが一番効率良く処理できるデータ型なのでたぶんint型を使ったと思いますが この推測でほぼ当たりです。 実際には関数の戻り値はCPUのレジスタを使って返します。 このときのレジスタのサイズが16ビットCPUでは16ビット、32ビットCPUでは32ビットとなっています。 OSにもよりますが互換性などの特殊な理由がない限りint型はCPUのビット数と一致します。 ただし、例外として32ビットCPU上で動作する16ビットOSなどもありこの場合はint型は16ビットで扱われることになります。

  • shigatsu
  • ベストアンサー率26% (511/1924)
回答No.1

そもそも前提が違ってるような気がしますが・・・ 関数の戻り値に一般的というのは無いと思います。ユーザ関数であればユーザが勝手に型を宣言できるし。 void型という何も戻り値の無い関数も有ります。引数と戻り値に特に関係はないと思います。 また後半のEOF云々ですが、型には同じビット幅で符号ありと符号なしというのが有ります。マイナス値を表現するには符号あり signed を、符号なしの場合は unsigned を明示的に書く必要があります。 何を参考に『引き数としてポインタをとる関数以外は全て』という前提を導き出されたのでしょうか?

関連するQ&A