これは、Ritchie&KernighanによるCプログラミング言語のサンプルコードです。
int c;
while((c=getchar())!=EOF) {
putchar(c);
}
putcharがint型の変数を参照していることに注意してください。このコードで文字と整数の両方を返し、表示できるのはなぜですか?
anint
は通常4バイトで表されますが、achar
は実際には1バイトのデータです。int
戻ってくるシングルにフルキャラクターなどを簡単に保存できgetchar()
ます。intが渡されるputchar(int)
と、表示する前に余分なスペースが失われます。EOF
この手法は、実際にはまったくではなくchar
、ファイルの終わりを通知するパスに役立ちint
ます。
char型は整数に過ぎず、ほとんどの場合、8ビットバイトです。int型は整数であり、通常は幅が広いため、charが保持できるすべての可能な値を保持できます。チェックを機能させるには、それを保持する必要がありsizeof(int) > sizeof(char)
ます。ほとんどの場合そうです。しかし、よく覚えていれば、規格はこれを義務付けていないと言われています。これは、すでに読み取られたEOFが実際のファイルの終わりであるかどうかを確認するための唯一のポータブルで安全な方法であることを意味します。それはで確認することfeof(FILE *)
です。(たとえば、システムのCHAR_BITが16の場合、定義上、sizeof(char)== 1ですが、sizeof(int)も1になる可能性があります)。
getchar()
値を確実に保持int
できるように戻ります(負の整数として定義され、ほとんどの実装では-1です)。タイプは、実装に応じて符号付きまたは符号なしの場合があります。符号付きの場合は、型の範囲内の値を保持できる可能性があり、符号なしの場合は、型に変換されたときに実際の文字値と区別がつかなくなる可能性があります。EOF
char
EOF
EOF
signed char
EOF
unsigned char