« hellokitty | 首页 | …… »

digdeep126

个人主页: http://digdeep126.blog.chinaunix.net

留言(2 条)

EOF是什么? 留言:

给出一段严重代码:

给出一段验证代码:
#include
int main()
{
signed char sc = 0xff;
unsigned char uc = 0xff;
int i = sc;
int j = uc;
int eof = -1; // END OF FILE

printf("i = %d = 0x%x\n", i, i);
printf("j = %d = 0x%x\n", j, j);
printf("sc == eof: %d\n", (sc == eof));
printf("uc == eof: %d\n", (uc == eof));

return 0;
}
运行结果:

digdeep@ubuntu:~/uulp$ ./char
i = -1 = 0xffffffff
j = 255 = 0xff
sc == eof: 1
uc == eof: 0

EOF是什么? 留言:

fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on end of file or error.

这两点肯定是对的!

另外在K&R书中,提到一个经典的bug:

char c;
while((c = fgetc(stdin)) != EOF)
putchar(c);
......

fgetc(stdin)返回的一个unsigned char然后转换成int,然后在赋值运算:
c = fgetc(stdin)中又转换为char。最后在“!=”运算符中又要从char转换到int。
那么:(int)0xff ?= (EOF = 0xffff)呢?
如果系统的char是默认是signed char,那么没有问题。因为(int)((signed char)0xff) == (EOF = 0xffff),可以正确的表示到达了文件(输入)末尾的概念。
但如果系统的char是默认是unsigned char,那么就有问题了。因为(int)((unsigned char)0xff != (EOF = 0xffff)。这样就没有办法正确的表达文件(输入)到达末尾的概念。这样就成了一个死循环。