khi mã sau được biên dịch nó đi vào một vòng lặp vô hạn:So sánh char unsigned và EOF
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;
}
Các trình biên dịch gcc cũng là cấp cho cảnh báo về việc lập
abc.c:13:warning: comparison is always true due to limited range of data type
mã chạy tốt khi unsigned char
là được thay thế bằng char
hoặc int
như dự kiến tức là nó chấm dứt.
Nhưng mã cũng chạy tốt cho unsigned int
. như tôi có tôi đã đọc trong EOF
được định nghĩa là -1
trong stdio.h
thì tại sao mã này không thành công cho unsigned char nhưng chạy tốt cho int không dấu.
cơ bản giống như [fgetc không xác định EOF] (http://stackoverflow.com/questions/3977223/fgetc-does-not-identify-eof). Tôi nghĩ rằng chúng tôi có loại câu hỏi này ít nhất một lần một tuần. –
Xem thêm http://c-faq.com/stdio/getcharc.html –
Bản sao có thể có của [Tại sao biến phải sử dụng để giữ giá trị trả về của getchar được khai báo là int?] (http://stackoverflow.com/questions/18013167/why-must-the-variable-used-to-hold-getchars-return-value-be-declared-as-int) –