« hellokitty | 首页 | …… »
个人主页: http://digdeep126.blog.chinaunix.net
在 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
2011-11-18 13:17:08
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)。这样就没有办法正确的表达文件(输入)到达末尾的概念。这样就成了一个死循环。
2011-11-18 13:16:15
留言(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
2011-11-18 13:17:08
在 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)。这样就没有办法正确的表达文件(输入)到达末尾的概念。这样就成了一个死循环。
2011-11-18 13:16:15