今天我只是躺在床上冥想编程的东西,当一个想法流入我的脑海时,我无法用自己的能力解决 . 这就是问题 .
我读了一本书,解释了为什么EOF值为-1,解释如下:
为什么-1?通常getchar()返回0到127范围内的值,因为它们是与标准字符集对应的值,但如果系统识别扩展字符集,它可能会返回0到255之间的值 . 在任何一种情况下,值-1都不对应任何字符,因此它可用于表示文件的结尾 .
1.)上面的陈述很奇怪,因为我记得除了有符号整数之外,有符号字符也是C中存在的一种变量,所以这意味着可以使用从-128到127的值 . 但为什么这本书仍然提到 - 1与键盘输入的任何字符使用都不矛盾?
6 回答
标准不是't say it' s
-1
.'s not a value that you can read from a file. It'是一个"out of band"的值
getc
,除了"end of file"之外的任何情况都不能返回 .getchar实际上返回一个
int
,这意味着它有超过8位 . 如果getchar
返回0到255(含)之间的数字,那么您知道它从您正在读取的文件中返回了一个有效字节 . 如果它返回-1,则表示您已到达文件的末尾 . 因为该值是int
,所以保证-1不等于0到255之间的任何值 .你得到的答案都没有提到(至少IMO)至关重要的一点 .
当您读取一个字符时,该值将被读取为
unsigned char
,并从那里转换为int
(§7.19.7.1/ 2):此特定报价适用于
fgetc
-getc
,getchar
和fread
都需要读取数据,就像调用fgetc
一样 .这隐含地(至少有点)假设
char
的范围小于int
,因此转换为int
允许至少表示一个值,而且't have come from the file. Elsewhere, the standard denies that as a requirement, but I think that denial is unrealistic -- I'm非常确定char
和int
相同大小的实现会破坏巨大的代码量 .这就是getchar()返回int的原因 . 如果它返回了signed char,你将无法区分EOF和-1字符(128来自扩展集),如果它返回unsigned char则-1将没有任何意义 . 但是getchar()返回int,如果它在0到255的范围内,则它是一个字符但是如果它返回-1那么它的EOF
getchar()
返回一个int,其中包含普通(无符号)char或EOF,因此没有问题 .getchar()返回一个int . -1表示EOF,或0到255. int类型足够大,不会与那些冲突 .