在书里Linux系统编程我读过一些这样的内容:
fgetc
返回读取为的字符unsigned char
投射到int
or
EOF
在文件末尾或错误。使用时的一个常见错误fgetc
is:
char c;
if ((c = fgetc()) != EOF) {...}
该代码的正确版本是:
int c;
if ((c = fgetc()) != EOF) { printf("%c", (char)c); ... }
那么,为什么我不能将返回值转换为char
在比较之前EOF
?为什么我一定要比较EOF
完全与int
? As EOF
定义为-1
,它通常不是被投射到char
?
是否存在不正确的平台/编译器?
您不能将返回值转换为 char 因为返回值可能是EOF
, and EOF
值取决于系统并且不等于任何有效的字符代码。link http://en.wikipedia.org/wiki/End-of-file
通常是-1
但你不应该这样认为。
检查这个很棒的答案c-常见问题解答网站 http://c-faq.com/stdio/getcharc.html:
如果如上面的片段所示,getchar 的
返回值被分配给一个字符。
-
如果 char 类型有符号,并且 EOF 定义(通常)为 -1,则
十进制值 255 的字符(C 中的“\377”或“\xff”)将是
符号扩展并且比较等于 EOF,提前终止
输入。 (假设 8 位字符)。
-
如果 char 类型是无符号的,则实际的 EOF 值将被截断(通过
丢弃其高阶位,可能导致 255 或
0xff)并且不会被识别为EOF,从而导致有效
无限输入。
希望能帮助到你!
Edited:(在这个答案上添加了@FatalError评论,这在c-faq网站上有解释,但这对我来说看起来更清楚)
“如果将其转换为 char,那么 EOF 会采用与某些有效字符相同的值,因此与该字符无法区分。仅此一点就足以证明不使结果成为 char”@FatalError 评论。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)