【问题标题】:C: why in K&R is written that EOF does not fit in char?C:为什么在 K&R 中写到 EOF 不适合 char?
【发布时间】:2016-07-02 15:07:23
【问题描述】:

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

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

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

我对此的解释是char可以存储从-127127的值,所以它可以包含-1,但是unsigned char只能从0255,所以它不能包含-1

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

【问题讨论】:

  • "例如对于 \t 结果是 32" 你的意思是 9 吗?
  • 我没看过。但也许他们谈论的是 eof 的概念值,它必须表示“不是字符值”。 -1 是它在字符来自 0 .. 255 的上下文中的值。如果您用 -128 .. 127 表示字符,显然 EOF 的整数值必须不同。
  • 可以读取 256 个不同的字符。这意味着 char 可以采用的每个值都是有效结果。这就是 EOF 不适合 char 以及 getchar 返回 int 的原因。
  • char 类型在 K&R 时代是未签名的。一些编译器仍然有一个compat option 来倒带时钟。

标签: c++ c


【解决方案1】:

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

标准没有规定charsigned还是unsigned类型。由实现决定 charsigned 还是 unsigned 类型。对于将unsigned 类型用于char 的实现,您不能将值-1 保存在char 中。 intsigned 类型,它可以保存值 -1。这就是int 成为getchargetcfgetc 的返回类型的原因。

【讨论】:

    【解决方案2】:

    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!)

    如果您确实使用char 捕获了getc 的返回值,那么您必须在每次看到与EOF 比较的值时测试ferror(stream) || feof(stream)。如果这个测试是假的,那么EOF实际上是一个字节值,你必须相应地对待它。

    (这也必须在发生 sizeof (int) == 1 的平台上完成)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      相关资源
      最近更新 更多