![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?c9bd177)
もしかすると、ちょい前の質問(https://okauth.okwave.jp/qa4151232.html)と同じことを聞いているような気もしますが、気にせずポスト。
その質問を読んだ時に strchr() のマニュアルを見たわけなんですが、そのプロトタイプ宣言は
char* strchr(const char* s, int c);
なんですね。どうして第 2 引数の型が int なのでしょう?「文字」c を検索するんだから普通に考えれば char ではないかと思うのですが、誰か教えて下さい。
ソースはこんな感じだったので、int である必要はないように思えるのですがどうなんでしょうか?
負数を与えたときに「何らかの動作」を期待してのことなのでしょうか?
char* strchr(const char* s, int c)
{
char ch;
ch = c; /* <= 結局 char 型にしている */
for ( ; ; ++s) {
if ( *s == ch ) {
return (char*)s;
}
if ( *s == '\0' ) {
return NULL;
}
}
}
No.2
- 回答日時:
charが慣習的にintで表される由来はint getchar()でしょうね。
charはC言語において、「ターゲットとするプラットホームで扱う全ての文字を十分表現できる」大きさと規定されている(参照:プログラミング言語C第2版 pp.44)。ところで、EOFは文字ではない。つまり、getchar()が返す値群は、上で言った文字+EOF分の表現ができないといけない。charが7ビットである処理系(レアケースなんかじゃないですよ。その当時は普通に存在してたんですから。ちなみに「1バイト」とは「8ビット」ではありません。2008年現在でも、1バイトが9ビットなマシンなんかも当たり前のように存在します。)を考えてみると7ビットなので128文字。これにEOFを加えた129文字をgetchar()は表現できる必要がある。なのでcharではなくintになっています。そこから文字1つは慣習的にEOFを想定のうちに入れたintになってるんじゃないかね。EOFが絶対来ない様な場面でも。> Cの場合は、charの値というのは書いた瞬間にintになりますので、関数の仮引数でchar型というのはあり得ません。
あれ? そうだったかな・・・・? NEC版 MS-DOS 3.30C+LSI-C/86ではAXレジスタではなくALレジスタを使うコードを吐いていたような・・・・? たしかTurbo-C++ Ver.1.01も(こっちは違うかも)。K&R(いわゆるC言語バージョン0.9)の頃は確かに全てのcharをintに直して受け渡した後でcharに戻していたけど(というかK&Rの頃はプロトタイプ宣言そのものが無かった)、ANSI Cではcharを暗黙にint扱いしないはず(なのでK&Rを想定したソースをコンパイルするとアドレスに食い違いができて落ちる事もあった)。charはcharとしてスタックに積むはずだよ。そう(暗黙変換)なる処理系もきっとあるのでしょうが、いずれにせよコンパイラ依存ではないでしょうかね。
ついでに言うと、標準Cライブラリのisalpha()などisxxxxx()系の関数のソースを見てみると面白い。きっと多くの処理系でASCIIを想定したビット(型は大体int)の配列になっていると思うんだけど、配列の大きさが256じゃなくて257なのよね。それで、実際に配列にアクセスする際に[charcode+1]を見る。これもEOF(=-1)が入ってくる事を想定した作りになっとるって訳。
早速の回答ありがとうございます。
>そこから文字1つは慣習的にEOFを想定のうちに入れたintになってるんじゃないかね。
>EOFが絶対来ない様な場面でも。
ふむ。getchar() が戻り値を int にしているのは単純に EOF を受けるためだと、お気楽に認識しておりました。
C の慣習なんですかねえ。個人的には、「EOF が有り得ない」と認識しているなら、それをコードに char 型として反映して欲しいところですが。
No.1
- 回答日時:
CとC++で違いますが、Cの場合は、charの値というのは書いた瞬間にintになりますので、関数の仮引数でchar型というのはあり得ません。
Cでは 'A' はint型。
C++では 'A' はchar型。
この回答への補足
>Cの場合は、charの値というのは書いた瞬間にintになりますので
>関数の仮引数でchar型というのはあり得ません。
お手数ですが「書いた瞬間に int になる」というのをもう少し説明していただけますか?
int foo(int c)
{
return c;
}
と
int foo(char c)
{
return c;
}
からは「まったく同じ」オブジェクトが作成されるということですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
OpenCVで32bit ヘッダ無しRaw画...
-
数字文字の出現回数を表示する...
-
C言語の入力した文字を反転させ...
-
テキストデータをそのままバイ...
-
ヘキサ表現が上手く行かない
-
fgetsなどのときのstdinのバッ...
-
CからC#へ
-
C言語 バイナリファイルをfloa...
-
C言語で自作したcpコマンドが上...
-
DPマッチング
-
テキストファイルの内容を文字...
-
C言語プログラミングについて(...
-
charでの計算?
-
-'0'の意味について
-
'const char *' 型は 'char *' ...
-
C言語のポインターで詰まっている
-
const char** p;のとき、free(p...
-
c++でテンプレートのコードでわ...
-
#define _CRT_SECURE_NO_WARNIN...
-
信頼区間の1.96や1.65ってどこ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
C言語のfor文です。 繰り返しの...
-
文字列から空白を取り除きたい...
-
charからLPTSTRへの変換方法
-
charでの計算?
-
配列をnビットシフトする
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
str系関数を使わずに二つの文字...
-
間接操作のレベルとは
-
int main()の・・・
-
C言語の入力した文字を反転させ...
-
atoi( ) の反対をやりたい
-
switch文で文字を比較すること...
-
テキストデータをそのままバイ...
-
Win32APIでのエディットボック...
-
double型の値をchar配列に変換...
-
干支のプログラム
-
コンパイルエラー invalid ope...
-
間接参照のレベルが異なっています
おすすめ情報