gpt4 book ai didi

c - 使用 int 或 char 数据类型并进行 K&R - "The C programming language"一书中的练习?

转载 作者:太空宇宙 更新时间:2023-11-04 00:28:29 25 4
gpt4 key购买 nike

首先,请原谅我问这个问题,因为它已经有几十个类似的变体了。但是,我不完全确定我是否能正确理解它。所以,请让我解释一下我设法理解的内容,如果我错了,请纠正我。

这是 K&R 书中的一个例子:

    #include <stdio.h>

main()
{
1) int c;

2) 4) while ((c = getchar()) != EOF)
3) putchar(c);
}

所以,我是这样理解上面的程序的:

1) 我们将 c 声明为 int 而不是 char 因为使用了 char 数据类型不会总是正确运行,它最终会把它搞砸。 Char 数据类型因系统而异,默认情况下可以是 signed [−127, +127] 或 unsigned [0, 255]。此外,默认情况下,EOF 并不总是 -1,因为它还取决于系统和编译器。

  • 1.1) 所以,如果我们将 c 声明为 char 并且它默认为 signed char在系统上它仍然可以工作,但如果我们输入等于 ASCII 128 及以上的字符,它会搞砸吗? 会发生什么? getchar() 将返回所选数据类型的最大可能 ASCII 值 127?

  • 1.2) 相反,如果我们将 c 声明为 char 并且默认为 unsigned char 在系统上,那么 getchar() 将始终NOT 等于 EOF 无论如何,因为我们不能存储负值,对吗?

因为上面的所有变体,将 c 声明为 int 以避免可能的冲突是正确的吗?

2) 我们键入一些字符作为输入 c = getchar() 获取此输入并将其转换为 ASCII 数字,然后检查以确保它不等于 EOF.

3) 如果它NOT等于EOF,它将输入字符显示为输出。

4) 它返回到我们必须输入新字符才能继续循环的状态。

以上都正确吗?

[附加问题] 此外,语句 getchar() != EOF 将输出 10作为值(value)。 1 值表示 getchar() 等于EOF0 作为值将告诉我们 getchar() 实际上等于 EOF,对吧?

[其他问题] 我在 Stack Overflow 上看到另一个用户提出的另一个关于 getchar()char 数据类型的问题,但是,我无法理解 Oliver Charlesworth 的答案.

Your program doesn't work fine; it won't be able to distinguish between EOF and 255.

这是什么意思?你能给我解释一下吗?另外,我也不明白这是什么意思:

0 through 7 (# 255) and EOF can be represented as 1111....32 times..... (assuming a 4 byte int)? There > will be no conflict here.

Link to the Oliver Charlesworth's answer.


更新

谢谢大家!对此:

0 through 7 (# 255) and EOF can be represented as 1111....32
times..... (assuming a 4 byte int)? There > will be no conflict
here.

如果我在下面的所有答案和解释后理解正确。这意味着 EOF 的值为 -1 将表示为 1111 1111 例如,如果数据类型为 char然后它会认为它是#255,因为它只有 8 位,它将完全按照 0xFF (#255) 的形式存储在内存中,没有其他指示(简而言之:数据丢失,现在而不是值 -1 它的意思完全不同),对吗? 所以,为了避免这种混淆,我们在将 c 声明为 时分配 4 个字节>int 以确保不会丢失任何数据,它会将 EOF-1 存储在 32 位中,例如 32 次...1111 1111 包括一个符号,表明它也是一个负值。 我理解正确吗?再次感谢!

最佳答案

您缺少的关键信息是这句话,来自 specification of fgetc ( getchar 被定义为等同于 fgetc(stdin) ):

If the end-of-file indicator for the input stream pointed to by stream is not set and a next character is present, the fgetc function [returns] that character as an unsigned char converted to an int. [Otherwise, it returns EOF.]

强调我的。这意味着,在 unsigned char 的典型实现中可以表示 0 到 255 之间的值,getchar将始终返回 0 到 255(含)或 EOF 范围内的值,即使 char已签名

与此同时,EOF 不保证为 -1(尽管它几乎总是如此),但保证为负,并且适合 int。 .

所以,当你这样做的时候

int c = getchar();

您可以确定所有可能的返回值都不会相互冲突:c要么是EOF ,它是负数,或者它将是 unsigned char 表示的值之一(0 到 255),它们都是非负数。如果你转换 c回到char 您检查它不是 EOF 之后,这就是安全的;来自 unsigned char 的转换至 char在最坏的情况下是实现定义的。

另一方面,当你做这些中的任何一个时

char c = getchar();          // this is wrong
unsigned char d = getchar(); // also wrong
signed char e = getchar(); // also wrong

您无法将 EOF 与可能存在于文件中的某些 字节值区分开来。变量的符号无关紧要,EOF 的实际值也是如此;重要的是 char , unsigned char , 和 signed char只能表示 2CHAR_BIT 个不同的值,所有这些值都可以在文件中,而 EOF 又是一个。这是 pigeonhole principle .

您应该知道 K&R 已经很老了,不再被认为是学习 C 的最佳书籍。 (我不知道目前最好的书是什么。)

关于c - 使用 int 或 char 数据类型并进行 K&R - "The C programming language"一书中的练习?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48833085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com