【发布时间】:2013-12-30 15:43:43
【问题描述】:
关于第 1 章中的这段话:Kernighan 和 Ritchie 的教程介绍:C 编程语言(我已将需要澄清的具体部分加粗,并在下面详细说明):
使用 getchar 和 putchar,您可以编写大量有用的代码,而无需了解更多有关输入和输出的信息。最简单的示例是一个程序,它一次将其输入复制到其输出一个字符: 读一个字符 while(字符不是文件结束指示符) 输出刚刚读取的字符 读取一个字符 将其转换为 C 给出:
#include <stdio.h>
/* copy input to output; 1st version */ main()
{
int c;
c = getchar();
while (c != EOF) {
putchar(c);
c = getchar();
}
}
关系运算符 != 表示“不等于”。 当然,在键盘或屏幕上看起来是一个字符,就像其他所有东西一样,在内部存储为位模式。 char 类型专门用于存储此类字符数据,但可以使用任何整数类型。我们使用 int 是出于一个微妙但重要的原因。
问题在于将输入的结尾与有效数据区分开来。解决方案是当没有更多输入时,getchar 返回一个独特的值,该值不能与任何真实字符混淆。这个值称为 EOF,表示“文件结束”。我们必须将 c 声明为一个大到足以容纳 getchar 返回的任何值的类型。我们不能使用 char,因为除了任何可能的 char 之外,c 必须足够大以容纳 EOF。因此我们使用 int。
我的理解是 Char 是 Int 的一种类型,只是它更小(就像其他语言中的 Int16、Int32、Int64 一样,但可以表示数字的大小)。
我知道每个字符都可以用一个 Char 类型的整数来表示,那么为什么 EOF 值不能用 Char 来表示呢?是不是因为 Char 类型中的每一个整数都已被计算在内,而对于数据类型来说,再多一个数字也太大了?
对我的知识的任何解释或更正将不胜感激。
【问题讨论】:
-
FWIW,K&R 不是一本从 21 世纪学习 C 的好书。它充满了神秘的单行代码而不是可维护的代码,以及不推荐使用的东西,比如没有原型的函数(例如你引用的例子。)
-
@OliCharlesworth 你会推荐什么书/网站?
-
@OliCharlesworth 您所说的 K&R 是否适用于两个版本,还是仅适用于第一个版本?
-
@DennisMeng:不确定,TBH。
标签: c types kernighan-and-ritchie