【发布时间】:2012-04-14 00:04:18
【问题描述】:
这是来自 Ritchie & Kernighan 的《The C Programming Language》的一些示例代码。
int c;
while((c=getchar())!=EOF) {
putchar(c);
}
请注意,putchar 指的是 int 类型的变量。为什么用这段代码可以同时返回和显示字符和整数?
【问题讨论】:
这是来自 Ritchie & Kernighan 的《The C Programming Language》的一些示例代码。
int c;
while((c=getchar())!=EOF) {
putchar(c);
}
请注意,putchar 指的是 int 类型的变量。为什么用这段代码可以同时返回和显示字符和整数?
【问题讨论】:
int 通常由 4 个字节表示,而char 实际上只是 1 个字节的数据。您可以在 getchar() 返回的单个 int 中轻松存储完整字符和更多字符。当一个 int 被传递给putchar(int) 时,它只会在显示它之前去掉多余的空间。这种技术对于传递EOF 很有用,它实际上根本不是char,而是表示文件结束的int。
【讨论】:
char 类型是签名的,那么您可以将 -1 放入 char,其中很多是签名的,并且转换规则允许 -1如果已签名,则转换为 char 类型。 getchar 返回int 的原因是因为它总是 有符号,而EOF 被定义为任何负数(不一定是-1,但通常是)。
char 类型只不过是一个整数,在大多数情况下只是一个 8 位字节。 int 类型是一个整数,它通常更宽,因此可以保留 char 可以保留的所有可能值。为了使检查工作,它必须持有sizeof(int) > sizeof(char)。几乎总是如此。但如果我记得很清楚,据说该标准并没有强制要求这样做;这意味着检查已读取的 EOF 是否为真正的文件结尾的唯一可移植且安全的方法是使用feof(FILE *) 进行检查。 (例如,如果在您的系统上 CHAR_BIT 为 16,则 sizeof(char) == 1 根据定义,但 sizeof(int) 也可能为 1)。
【讨论】:
sizeof(long) >= sizeof(int) >= sizeof(short) >= sizeof(char),我知道一些DSP(来自TI)有CHAR_BIT == 32和sizeof (long)=1
getchar() 返回int 以便它可以可靠地 保持EOF 值(定义为任何负整数,在大多数实现中为-1)。 char 类型可能是有符号或无符号的,具体取决于实现。如果它已签名,那么它可能能够保持EOF 值,前提是EOF 在signed char 类型的范围内,如果它未签名,则它可能变得无法区分EOF 转换为 unsigned char 类型时的实际字符值。
【讨论】:
getchar 返回一个int,因为该函数在K&R 向语言中添加函数原型之前就已经存在。那时 all 函数返回一个 int。然后他们利用这个事实来压缩 EOF 值。