このページをはてなブックマークに追加このページを含むはてなブックマーク このページをlivedoor クリップに追加このページを含むlivedoor クリップ

目次

getcharの戻り値の型

 入力された文字を返すなら、戻り値がchar型で十分であると考えられるが、プロトタイプ宣言ではint型になっている。

 1つ目の理由はCには汎整数拡張(integral promotion)という規則がある。この規則は、式の中でintより小さな整数型(charやshort)が存在したらintに変換するというものである。つまり、char型の変数は存在するが、式の中ではすぐにintに変換されてしまうのである。

 2つ目の理由はgetcharは取得できる文字がないときはEOFを返すからである。よって、getcharの戻り値を格納する変数はint型にしなければならない。
 1バイトが8ビットであると仮定すると、unsigned char型の1バイトで取り得る数値は0〜255の256個である。getcharで帰って来る数値の個数は文字として取り得る値256個に、EOFを表す数値を加えた合計257個の数値が返ってくる可能性がある。よって、getcharの戻り値がunsigned char型では、許容範囲を越えてしまうのである。
 EOFを表す数値が-1(多くの処理系では-1)であったとすると、getcharがint型で-1(=0xFFFFFFFF)を返したとしても、受け取り側がchar型であると、0xFFとして戻り値を受け取ってしまう。すると、getchar関数でバイナリファイルを読むときに、EOFであるのか、それとも255(=0xFF)であるのかが区別できなくなってしまう。つまり、getchar関数でバイナリファイルを読むときは戻り値をintで受けないと、ファイルの途中で戻り値がEOFと誤認されてしまう可能性があるのである。

 よって、getcharを使うときは次のプログラムのように、int型で受けなければならないのである。

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
 
 
-
|
|
|
|
!
#include <stdio.h>
 
int main(){
    int a;
    while ((a = getchar()) != EOF)
        putchar(a);
    return 0;
}

参考文献

  • 『C言語体当たり学習徹底入門』