
最近、疑問に思っていることがあって質問したいんですが、一般的にc言語
で使われる関数っていうのは、引き数としてポインタをとる関数以外は全て
戻り値はint型なのですがこれはなぜでしょう。私自身の結論としては、も
し関数の戻り値がchar型だとしたらchar型で表せる範囲の値は全てasciiコー
ドとして使われているので、もしエラーがあって戻り値としてEOF(-1)を返す
際に1byteでは同じビット配列になる255が既に使われていてEOFとして-1を定
義できないために、-1と255が同じビット配列ではない1byte以上のデータ型
つまりint型(たぶん、int型がコンピュータが一番効率良く処理できるデータ型なのでたぶんint型を使ったと思いますが)を使ったのではないかと言う
結論に達したのですがこれは正しいのでしょうか。どなたか御教授お願い致
します。
No.2ベストアンサー
- 回答日時:
「一般的」とあるのは、「標準ライブラリが大体そうなっているから」と
いうことですよね。
今の C というのは ANSI というところで定められた規格に則っているもの
がほとんどなんですが、その規格以前から C はありました。そのときには
void という型が無かったので、特に関数の戻り値が必要ではない関数でも
何か戻り値を指定する必要がありました。なので、
> int型がコンピュータが一番効率良く処理できるデータ型なので
という判断は、ある意味正しいです。
また、char型云々の話は、fgetc() の戻り値が int である理由として
良く言われることです。
ただ、「一般的に」の範囲次第なのですが、そうではない関数も
標準としてあります。例えば、メモリの動的割り当てを扱う malloc() は
void* ですし、それで獲得したメモリの開放を行う free() は void です。
また、成功した/しないだけが分かれば十分な関数では、いわゆる「論理型」
と呼ばれる型で十分なのですが、ちょっと前の C の規格では、その型が無い
ので、効率よく扱える int を戻り値にしている、ということもあります。
ぐだぐだ書きましたが、int が整数を効率的に扱える型だから、という
考え方は概ねあっています。
No.5
- 回答日時:
Cでは式の評価時に「char,shortはintへ」、「unsigned char,unsigned shortはunsignedへ」、「floatはdoubleへ」と暗黙の格上げが行われます。
よって、「関数値としてのcharやshort」は無意味です。
long, unsigned long, long doubleを返す関数は存在します。
EOFの取り扱いについては“そういう面もある”という程度です。
No.4
- 回答日時:
こんにちは。
itohhといいます。たまたま、あなたが見たソースがint型の関数だけだったのでしょう。
標準の関数でもいろいろな型で返していると思うのですが...
(例えば、malloc関数はvoid*型ですよね。それに、strcat関数なんかはchar*型です)
ユーザが作成する関数では、自分で作った構造体のポインタを返すとかもあります。
その時々にあった型(int,long,BOOLや構造体のポインタ)を返すことが出来ます。(使い分けなければいけない!!)
蛇足ですが、コンピュータに一番効率が良く処理が出来るデータ型はOSによって変わってきます。(int型もあれば、long型もあります。)
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ビットで扱われることになります。
No.1
- 回答日時:
そもそも前提が違ってるような気がしますが・・・
関数の戻り値に一般的というのは無いと思います。ユーザ関数であればユーザが勝手に型を宣言できるし。
void型という何も戻り値の無い関数も有ります。引数と戻り値に特に関係はないと思います。
また後半のEOF云々ですが、型には同じビット幅で符号ありと符号なしというのが有ります。マイナス値を表現するには符号あり signed を、符号なしの場合は unsigned を明示的に書く必要があります。
何を参考に『引き数としてポインタをとる関数以外は全て』という前提を導き出されたのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
戻り値で構造体を返すことは可...
-
C++で関数ポインタから関数名を...
-
コンストラクタでnewを失敗した...
-
fopne で失敗する原因
-
参照型で受け取った引数をポイ...
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
パスからファイル名を抽出
-
メモリのアドレスからの値の取...
-
トリプルポインタが必須!とな...
-
c言語で任意のファイルから読み...
-
VBはCを混乱させる?
-
LPSTR型の初期化について
-
ハンドルはポインタか
-
単方向リスト
-
C言語 ポインタと配列の違い...
-
自作DLLの引数について、ポイン...
-
プーさんのマウスポインタを教...
-
C言語でのconstを返す関数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
セグメントエラー
-
Run-Time Check Failure #3とい...
-
ExcelVBAでのkernel32(64bit)
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
参照型で受け取った引数をポイ...
-
トリプルポインタが必須!とな...
-
ハンドルはポインタか
-
LPSTR型の初期化について
-
ポインターの使用法や利点
-
ポインタについて
-
c言語で任意のファイルから読み...
-
基本アルゴリズムの『返す』の...
-
コンストラクタでnewを失敗した...
-
ハンドル、アドレス、ポインタ...
-
アプリを32bitから64bit移行
-
デバイスハンドルとは?
-
NULLとブランクの違い
おすすめ情報