这是我自己的实验,以了解底层的内容,这个程序对编译器意味着什么?
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()
,为什么还要再次编写语句?对不起,如果我感到困惑。
答案 0 :(得分:4)
while ((c==getchar()) != EOF) {
...
}
是一个while循环。它评估循环的每次迭代的条件,并且仅在条件为假时终止。
在您的情况下,条件是:
(c==getchar()) != EOF)
这是一个荒谬的表达,但我们无论如何都要检查它:
首先,该计划将评估:
getchar()
这可以从标准输入中获取击键。表达式的值是键的值。
然后:
c==getchar()
这会得到getchar()
的结果,并将其与c
中当前的结果进行比较。在您的第一个程序中,c
未初始化,因此其值不确定。如果c
具有已定义的值,则c==getchar()
将评估为true
或false
。由于c
没有定义的值,c==getchar()
也没有定义的值。
现在程序评估:
(c==getchar())
哪个仍然是true
或false
,但在您的情况下,它是未定义的。
该计划接下来考虑:
(c==getchar()) != EOF
也就是说,它将true
- false
值与EOF
进行比较;这没有什么特别的意义,在你的情况下,我们仍然有未初始化c
的未定义行为。
总之,如果c
已初始化,则表达式将从标准输入中获取密钥,然后将true
或false
与EOF
进行比较。正如我所说,这是一个荒谬的表达。
答案 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
(如果它们相同)。后者是不太可能的,但理论上可能的是,通过一些幸运的(?)机会,垃圾值确实碰巧匹配输入流中的下一个字符。
然后比较0
或1
以查看它是否与EOF
匹配。那么,EOF
将是一些负值;这就是定义。显然,0
或1
永远不会匹配任何负值,因此您的循环将是无限的。
至于你的第二个代码片段:
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
表示
c
和result returned from getchar()
相同,则c == getchar()为真。
c == getchar()
将始终不等于EOF(因为既不是真的也不是等于EOF)所以程序应该无限循环打印随机出现的字符,因为你从未初始化c int c;
。 / p>