我对C很感兴趣,所以我想了解更多关于C,特别是C89的内容,看看随着时间的推移,这种语言是如何变化的。我买了Denis的“C编程语言”(第二版)。
书中的一个例子将我介绍一个关于getchar()函数的复杂情况。
示例1,这是我读了这本书之后的例子是:
#include <stdio.h>
int main()
{
int c = getchar();
printf("\'\\n\' character in c: %d\n", c == '\n');
printf("\'\\n\' character in c: %d\n", c == '\n');
}示例1的输出是:
a
'\n' character in c: 0
'\n' character in c: 0在本例中,输出在此输入中不显示任何新行字符。然而,我尝试的另一个例子是:
#include <stdio.h>
int main()
{
int c;
while ((c = getchar()) != EOF) {
printf("\'\\n\' character in c: %d\n", c == '\n');
}
}代码的输出是:
a
'\n' character in c: 0
'\n' character in c: 1我不明白为什么第二个示例重复printf()函数,以及它如何在进入循环时读取'\n‘字符。同时,第一个示例没有显示与'\n‘字符有关的任何内容
发布于 2019-03-01 14:01:46
举你的第二个例子,
while ((c = getchar()) != EOF) {
printf("\'\\n\' character in c: %d\n", c == '\n');
}并展开循环。它将成为:
c = getchar();
if (c == EOF) return 0;
printf("\'\\n\' character in c: %d\n", c == '\n');
c = getchar();
if (c == EOF) return 0;
printf("\'\\n\' character in c: %d\n", c == '\n');
c = getchar();
if (c == EOF) return 0;
printf("\'\\n\' character in c: %d\n", c == '\n');
... and so on ...现在将其与第一个版本进行比较,您可以看到,第二个示例在getchar之间进行printf调用,而第一个示例只有一个getchar调用。
换句话说,第一个示例只读取字符'a',而第二个示例首先读取'a',然后读取'\n',然后读取.(无论你下一次输入什么)
发布于 2019-03-01 13:54:53
a并按enter键。然后stdin缓冲区将看起来像a,\n,两个字符。c的值是'a',它不等于'\n',输出为0。c的值是'\n',它等于'\n',输出1。c变成EOF时,printf永远不会被执行。发布于 2019-03-01 13:51:42
输入a后按enter键。
因此,您的输入流将有"a\n“。
while ((c = getchar()) != EOF) {将读取,直到到达EOF为止,因此它将首先读取a,然后读取\n(输入)。
https://stackoverflow.com/questions/54946005
复制相似问题