【问题标题】:Using int for character types when comparing with EOF与 EOF 比较时使用 int 字符类型
【发布时间】:2011-12-11 12:39:56
【问题描述】:

引自 Kernighan 和 Ritchie 的“C 编程语言”第 16 页 -

#include<stdio.h>

main()
{
int c;
c = getchar();

while(c!=EOF)
{
    putchar(c);
    c = getchar();
} 

getchar();
return 0;
}

"char 类型专门用于存储此类字符 数据,但可以使用任何整数类型。我们使用int 表示微妙但 重要原因。问题是区分输入的结尾 从有效数据。解决方案是 getchar 返回一个独特的 没有更多输入时的值,不能混淆的值 任何真实的角色。该值称为EOF,表示“结束 文件”。我们必须声明 c 是一个足够大的类型来保存任何值 getchar 返回。我们不能使用char,因为c 必须很大 除了任何可能的char 之外,足以容纳EOF。因此我们 使用int。”。

我查了一下stdio.h,上面写着#define EOF (-1)

这本书最后指出char 不能使用,而这个程序“工作得很好”(见编辑)c 也是char 数据类型。到底是怎么回事?任何人都可以用位和有符号值来解释吗?

编辑:
正如 Oli 在答案中提到的,程序无法区分 EOF255。所以它不会正常工作。我想知道发生了什么 - 你是说当我们进行比较 c!=EOF 时,EOF 值被强制转换为 char 值 = 255(二进制的 11111111;即用 2 的补码写入时 EOF 的位 0 到 7符号)?

【问题讨论】:

  • 定义“工作得很好”。您尝试过哪些输入?
  • @CharlesBailey - 我知道该程序无法正常使用 255 输入,正如 Oli 在下面的答案中提到的那样。我正在尝试探索这里发生的事情。相应地编辑问题。

标签: c


【解决方案1】:

getchar 结果是将输入字符转换为unsigned char,然后转换为intEOF,即它将在 -1 - 255 范围内,即 257 个不同的值,您不能将其放入8 位 char 不合并其中两个。实际上,要么您将EOF 误认为是有效字符(如果char 未签名,则会发生这种情况),或者会将另一个字符误认为EOF(如果char 已签名,则会发生这种情况)。

注意:我假设一个 8 位 char 类型,我知道这个假设没有得到标准的支持,它只是迄今为止最常见的实现选择。

【讨论】:

  • 酷。因此,我们可以避免这种歧义的一种方法是我们使用一个 int,其中所有字符都由位 0 到 7 (# 255) 表示,EOF 可以表示为 1111....32 次.....(假设4字节整数)?这里不会有冲突。
  • 这确实是getchar()的结果。
【解决方案2】:

您的程序运行不正常;它将无法区分EOF255

它看起来正常工作的原因是因为char 在您的平台上可能是signed,所以它仍然能够代表-1

【讨论】:

  • 是的。你是说当我们进行比较 c!=EOF 时,EOF 值被强制转换为 char 值 = 255(二进制的 11111111;即用 2 的补码表示法编写时 EOF 的位 0 到 7)?
  • 不,促销规则是这样的,在c!=EOF 中,比较是在整数上进行的。
  • char 是无符号类型的平台上,表达式c != EOF 将始终为真。
  • 事实证明 char c = -127 和 char c = 129 与 putchar 一起使用时输出相同的值(即对应于 ASCII 等价物 10000001 的值,因为 -127 和 129 都有这种表示) .
  • @Vikesh, putchar 将其输入字符转换为unsigned char 并写入结果。因此,-127 和 129 在 8 位字符实现中确实被转换为相同的字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2018-05-11
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多