我刚开始学习 C编程语言,我需要问你这个问题:
我知道函数getchar()
为您提供了一个始终为正的整数。
例如,对于\t
,结果为32,此值可以存储在char。
K& R的书说,-1
的EOF不能存储在char中(但实际上它可以存储)。
无论如何,它不能使用unsigned char。
我给出的explenation是char可以存储从-127
到127
的值,因此它可以包含-1
,但是unsigned char只能来自0
} 255
,因此它不能包含-1
。
我是对的吗?为什么K& R的书会这么说?
答案 0 :(得分:2)
K& R的书说,-1的EOF不能存储在char中(但实际上它可以存储)。
标准未指定signed
是unsigned
还是char
类型。由实现决定signed
是unsigned
还是unsigned
类型。对于char
使用-1
类型的实现,您无法在char
中保留值int
。 signed
是-1
类型,可以保存值int
。这就是getchar
成为getc
,fgetc
和<messageFormatter class="org.apache.axis2.transport.http.ApplicationXMLFormatter" contentType="text/html"/>
的返回类型的原因。
答案 1 :(得分:1)
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,但类似的推理适用于其他负值.ISO C仅表示EOF
为负。可能是INT_MIN
!)
如果您使用getc
捕获char
的返回值,则每次看到比较等于ferror(stream) || feof(stream)
的值时都必须测试EOF
。如果此测试为false,则EOF
实际上是一个字节值,您必须相应地对其进行处理。
(这也必须在发生sizeof (int) == 1
)的平台上完成。