我给出了函数的一部分以下代码:
char ch;
ch = fgetc(fp);
if (ch == EOF)
return -1;
其中fp
是作为参数传递给函数的指针到文件/流。
但是,检查了fgetc()
,getc()
和getchar()
的使用情况后,似乎它们都返回int类型而不是类型char,因为EOF不适合值0-在char中使用的255,通常是< 0(例如-1)。但是,这引出了我提出三个问题:
getchar()
返回int,为什么char c; c = getchar();
是函数的有效用法?在这种情况下,C是否会自动键入强制转换为char,如果getchar()
替换为getc(fp)
或fgetc(fp)
?fgetc()
或其他两个函数返回EOF时,程序会发生什么?它会再次尝试像以前一样投射到角色然后失败吗?什么内容存储在ch
中?ch == EOF
如何进行有效比较,因为EOF不能用char变量表示?答案 0 :(得分:1)
如果getchar()返回int,为什么是char c; c = getchar();函数的有效用法?
不是。只是因为你可以编写和编译(以某种方式)允许你编译它,不会使代码有效。
我相信以上回答所有问题。
只是要添加,如果返回EOF
,则无法将其存储在char
中。 char
的签名是实现定义的,因此,根据章节6.3.1.3,C11
当整数类型的值转换为_Bool以外的另一个整数类型时,if 该值可以用新类型表示,不变。
否则,如果新类型是无符号的,则通过重复添加或转换该值 减去一个可以在新类型中表示的最大值 直到该值在新类型的范围内.60)
- 醇>
否则,新类型已签名且值无法在其中表示;无论是 结果是实现定义的或引发实现定义的信号。