次のコードをコンパイルすると、無限ループに入ります。
int main()
{
unsigned char ch;
FILE *fp;
fp = fopen("abc","r");
if(fp==NULL)
{
printf("Unable to Open");
exit(1);
}
while((ch = fgetc(fp))!=EOF)
printf("%c",ch);
fclose(fp);
printf("\n",ch);
return 0;
}
gccコンパイラはコンパイル時にも警告を出します
abc.c:13:warning: comparison is always true due to limited range of data type
コードは、にunsigned char
置き換えられたとき、char
またはint
期待どおりに終了したときに正常に実行されます。
ただし、コードも正常に実行さunsigned int
れます。私が読んだように、EOF
定義は次のよう-1
にstdio.h
なります。なぜこのコードはunsigned charでは失敗するのに、unsignedintでは正常に実行されるのでしょうか。