这对getchar()方法有什么用处?

时间:2013-09-04 02:27:16

标签: c getchar

这是我自己的实验,以了解底层的内容,这个程序对编译器意味着什么?

main()
{
  int c;
  printf("%d\n",c);
  printf("%d ", getchar());


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

当我说c必须等于getchar()(c == getchar())时,它是否不通过while循环继续?现在我对自己的代码感到困惑,我的代码必须是什么意思!

此外,在此代码中:

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

如果我们将int c修改为int c = getchar(),为什么我们不能这么写:

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

编译器应该从前面的语句中知道c = getchar(),为什么还要再次编写语句?对不起,如果我感到困惑。

4 个答案:

答案 0 :(得分:4)

while ((c==getchar()) != EOF) {
  ...
}

是一个while循环。它评估循环的每次迭代的条件,并且仅在条件为假时终止。

在您的情况下,条件是:

(c==getchar()) != EOF)

这是一个荒谬的表达,但我们无论如何都要检查它:

首先,该计划将评估:

    getchar()

这可以从标准输入中获取击键。表达式的值是键的值。

然后:

 c==getchar()

这会得到getchar()的结果,并将其与c中当前的结果进行比较。在您的第一个程序中,c未初始化,因此其值不确定。如果c具有已定义的值,则c==getchar()将评估为truefalse。由于c没有定义的值,c==getchar()也没有定义的值。

现在程序评估:

(c==getchar())

哪个仍然是truefalse,但在您的情况下,它是未定义的。

该计划接下来考虑:

(c==getchar()) != EOF

也就是说,它将true - false值与EOF进行比较;这没有什么特别的意义,在你的情况下,我们仍然有未初始化c的未定义行为。

总之,如果c已初始化,则表达式将从标准输入中获取密钥,然后将truefalseEOF进行比较。正如我所说,这是一个荒谬的表达。

答案 1 :(得分:3)

你说你想看看引擎盖下?大!让我们深入探讨:)

while ((c == getchar()) != EOF)

正如其他人所说,这应该是while ((c = getchar()) != EOF)。您执行作业(=)而非等同测试(==)的原因是因为您实际上将两行代码分成一行:c = getchar();while(c != EOF)。因此,如果当前正在读取的字符为k,程序将以某种方式对其进行评估:

while ((c = getchar()) != EOF)
while ((c = 'k') != EOF)
while (('k') != EOF)
while ('k' != EOF)
while (1) // true

它具有方便的副作用,c内部仍有k,无论你打算做什么。

另一个问题在于:

int c;
printf("%d\n",c);

printf会抱怨,因为您还没有分配给c的任何内容。它被“宣布”,但没有“初始化”。它不能打印不存在的东西 - 如果可以,它肯定会打印出你不想要的东西。

答案 2 :(得分:2)

你有一个额外的等号,你需要删除:

while ((c == getchar()) != EOF){

应该是

while ((c = getchar()) != EOF){

以下是发生的事情。执行(c == getchar())时,以c开头是未初始化的,因此它有一些垃圾值。将该垃圾值与输入流中的下一个字符进行比较,以查看它们是否相同。比较的结果将是0(如果它们不同)或1(如果它们相同)。后者是不太可能的,但理论上可能的是,通过一些幸运的(?)机会,垃圾值确实碰巧匹配输入流中的下一个字符。

然后比较01以查看它是否与EOF匹配。那么,EOF将是一些负值;这就是定义。显然,01永远不会匹配任何负值,因此您的循环将是无限的。

至于你的第二个代码片段:

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

您没有检查第一个字符是否为EOF,因为第一个c后的getchar()值会立即被while中的作业替换条件。假设存在非EOF第一个字符,您的代码将起作用。

至于你的第三个代码片段:

c = getchar();
while (c != EOF) {     // corrected your typo of ( instead of {
    putchar(c);
    c = getchar();
}

您必须在c = getchar()循环内再次编写while的原因是使用输入流中的第二个和后续字符更新c的值。否则,它总是将c的当前值(它是输入流中的第一个字符)与EOF进行比较,这也是一个无限循环,除非第一个字符恰好是{ {1}}。

实现您想要的最简洁的方法是:

int c;    while((c = getchar())!= EOF)         putchar(c);

...就像你的第二个代码片段一样,减去第一个EOF的额外行,并将其分配给getchar()

答案 3 :(得分:1)

c == getchar() != EOF表示

如果cresult returned from getchar()相同,则

c == getchar()为真。

c == getchar()将始终不等于EOF(因为既不是真的也不是等于EOF)所以程序应该无限循环打印随机出现的字符,因为你从未初始化c int c;。 / p>