
C言語を習いはじめてまもない者です。getcharとisalphaについて教えてください。
まず、getcharから。この関数は、キーボードから文字を一文字ずつ読み、読み出した文字を返す。といった働きをするそうですが、この関数を用いて、取り込んだ文字をなぜか、int型で宣言した変数に代入しています。(例:int aなどのaに取り込んだ文字を代入している。)なぜ、文字を取り込んでいるのに、intで宣言した変数に代入すのでしょうか?charで宣言した変数に代入しなくていいのですか?
次に、isalphaについてです。この関数は、変数に代入されている文字が数字か文字かを判断して、文字が入力されていると、0以外の値を返す関数だそうです。しかし、この関数も、変数の宣言がintです。なぜ、charではなくintで宣言するのでしょうか?
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
式と評価について調べてみてください。
C言語ではchar,shortは評価段階で暗黙にintへの格上げが行われます。
unsigned char unsigned shortはunsignedに、floatはdoubleに。
「EOFのあつかい」という側面が無いわけではありませんが、C言語の「暗黙の方変換」が席にあっての話です。
charがintへ格上げされるからEOFを返すことが可能となっているのです。
C言語FAQ11.3に『古い書き方の 宣言ではdoubleを使ったほうがわかりやすい)"狭い"(char、short int、float)型は、関数引数や戻り値としては避 けたほうが安全であろう。』とあるように古いタイプ(プロトタイプ宣言の無い)のCでは関数インターフェースにcharやshortは使いませんでした。
stdio(getcharが含まれる)やtypes(isalphaが含まれる)はこの時代に定義されたものであり、関数値/引数がint以上の幅を持つことが前提となっています。
C言語FAQ日本語訳のURLを紹介します。
あと、keronpasさんのお使いの参考書にそのあたりの解説が無いのなら別の参考書を見たほうがよいでしょう。
ウチのページでC/プログラミングの書籍を紹介していますので参考にしてください。
http://www.geocities.co.jp/SiliconValley-PaloAlt …
参考URL:http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
No.1
- 回答日時:
EOF を返したり(getchar())、与えたり(isalpha())しなければならないからです。
EOF は通常 -1 で、これを表現するために unsigned char では足りないので int 型が用いられます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# int temp = 0; if(isdigit(arr[i])){//文字が数字であれば(0~9) 1 2022/03/27 01:37
- PHP カラーミーショップのSmartyでの文字列抜き出し 2 2022/05/06 11:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++変数宣言時のコンストラクタ...
-
ビット演算について
-
C++でデータの途中から読み込み
-
仮想基底クラスをもつクラスの...
-
#pragmaについて
-
VBAのプログラムで、DIAG = 1# ...
-
errorC2228 CColorDialog
-
この型変換の内容がわかりませ...
-
int型とchar型について
-
static宣言について
-
構造体のポインタにNULLが入らない
-
文字列の検索&排除をするプロ...
-
long型のデータをバイト型の配...
-
binファイルが軽くなる変数への...
-
構造体を型の異なる構造体に代入
-
デフォルトコンストラクタで分...
-
プログラミングに関する問題が...
-
構造体の配列について(2)
-
char a[]="thank you for comin...
-
C言語特有の文法や概念について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
「#undef」と「#define」の使い...
-
C言語 構造体の中に共用体を定...
-
構造体のデータを丸ごとコピー...
-
VBAの変数のデータ型を変更する...
-
日付チェック関数について
-
整数から16進数への変換 現在c...
-
typedefをプログラム中で解除す...
-
値が代入されてない時
-
C++ 構造体の一括初期化 {0}
-
VBAで符号無し整数
-
long型のデータをバイト型の配...
-
変数の初期化について
-
1バイトデータの読み出しについて
-
charとucharの違い
-
VBAにてcolorindexを変数に格納...
-
異なる構造体のデータのコピー
-
構造体を型の異なる構造体に代入
-
構造体にする理由・利点・使用例
おすすめ情報