我刚开始学习C语言,我需要问你这个问题:
我知道函数getchar()
给出的整数总是正数。例如,对于\t
,结果是32,这个值可以存储在char中。
K&R的书说,EOF,即-1
,不能存储在char (但在现实中,它可以)。不管怎样,它不适用于未签名的字符。
我对此的解释是,char可以存储从-127
到127
的值,因此它可以包含-1
,但是无符号字符只能从0
存储到255
,所以不能包含-1
。
我说的对吗?为什么K&R的书会这么说?
发布于 2016-07-02 15:20:10
K&R的书说,EOF,即-1不能存储在字符(但在房地产,它可以)。
标准没有指定char
是signed
类型还是unsigned
类型。由实现来决定char
是signed
类型还是unsigned
类型。对于将unsigned
类型用于char
的实现,不能在char
中保存值-1
。int
是一个signed
类型,它可以保存值-1
。这就是为什么int
是getchar
、getc
和fgetc
的返回类型。
发布于 2016-07-02 16:02:57
C中的getc
函数访问一个流,并返回0到UCHAR_MAX
范围内的非负字节值,或者返回一个等于EOF
常量的值,该值为负值。它作为类型int
值返回。
这两个数据范围不能适应char
类型,无论它是有符号的还是无符号的。如果将EOF
值存储在char
中,则会造成歧义,因为它与有效字节值发生冲突。0
到UCHAR_MAX
的范围已经声明了字符类型中的所有可能值。
假设我们现在处在一个几乎无所不在的8位,两位互补的世界。签名的char
的值从-128到127。该范围涵盖-1:值-1可能发生在char
-s流中。unsigned char
范围从0到255。值-1不发生;但是如果-1被转换为unsigned char
,它将变成255。这是一个有效的字节值。(请注意,EOF
不一定是-1,但类似的推理也适用于其他负值。国际标准化组织只说EOF
是阴性的。可能是INT_MIN
!)
如果您确实使用一个getc
捕获了char
的返回值,那么每次看到一个与EOF
相等的值时,您都必须测试ferror(stream) || feof(stream)
。如果这个测试是假的,那么EOF
实际上是一个字节值,您必须相应地对待它。
(这也必须在发生sizeof (int) == 1
的平台上完成)。
https://stackoverflow.com/questions/38161505
复制相似问题