C:为什么在K& R中写道EOF不适合char?

时间:2016-07-02 15:07:24

标签: c++ c

我刚开始学习 C编程语言,我需要问你这个问题:

我知道函数getchar()为您提供了一个始终为正的整数。 例如,对于\t,结果为32,此值可以存储在char。

K& R的书说,-1的EOF不能存储在char中(但实际上它可以存储)。 无论如何,它不能使用unsigned char。

我给出的explenation是char可以存储从-127127的值,因此它可以包含-1,但是unsigned char只能来自0 } 255,因此它不能包含-1

我是对的吗?为什么K& R的书会这么说?

2 个答案:

答案 0 :(得分:2)

  

K& R的书说,-1的EOF不能存储在char中(但实际上它可以存储)。

标准未指定signedunsigned还是char类型。由实现决定signedunsigned还是unsigned类型。对于char使用-1类型的实现,您无法在char中保留值intsigned-1类型,可以保存值int。这就是getchar成为getcfgetc<messageFormatter class="org.apache.axis2.transport.http.ApplicationXMLFormatter" contentType="text/html"/> 的返回类型的原因。

答案 1 :(得分:1)

C中的getc函数访问流,并返回0到UCHAR_MAX范围内的非负字节值,或者返回等于EOF常量的值,是否定的。它以类型int返回。

这两个数据范围无法适合char类型,无论是有符号还是无符号。 EOF值(如果存储在char中)会产生歧义,因为它与有效的字节值冲突。范围0UCHAR_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)的平台上完成。