**已关闭。**此问题为not reproducible or was caused by typos。目前不接受答复。
此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
昨天关门了。
Improve this question
(固定)
我最初的问题(在提出问题时犯了一些错误)-
#include <stdio.h>
int main()
{
for (double nc = 0; getchar() != EOF; ++nc)
printf("%0.f", nc);
return 0;
}
如果我给予输入“a”(不包括引号),我得到01作为输出,输入:“ab”,输出:012输入:回车键,输出:0
为什么会这样?不应该\n给予输出1,因为在我的设备中EOF值是-1和ascii新行字符值是10,我使用VS代码和Mac M1,FYI,即使在在线编译器中也有相同的输出。
我想问的问题写错了
这是K&R的原始代码:
#include <stdio.h>
int main()
{
double nc;
for (nc = 0; getchar() != EOF; ++nc)
;
printf("%0.f", nc);
return 0;
}
**我在分号上犯了一个错误,并假设对于空的for
循环,我们不需要分号,并且我在循环中声明了double,这不是ANSI标准,它扰乱了问题求解器的解释,对此表示抱歉。
2条答案
按热度按时间bt1cpqcv1#
你正在循环一个从0开始的变量,你总是在循环的每次迭代中递增它,直到
EOF
。因此,您的输出将如下所示
电话:012345678910
如果你只想在EOL之前得到字符数,那么你可以这样做:
在这种情况下,空的
for
循环将不包含printf
,因此,在循环结束后,您将只打印结果一次。对于您的代码,for
循环在每一步都调用printf
,输入到目前为止的字符数。toe950272#
在C中,for循环的执行顺序如下:
1.计算第一个头表达式
1.计算第二个头表达式;如果为真后藤3.,否则转到6.。
1.对循环体求值
1.计算第三个头表达式
1.退出
如果你知道while循环是如何工作的,这可能会对你有所帮助:
类似于
因此,在您的代码中,当您只按enter键时,循环体运行一次(对于
'\n'
)并打印0
。当您输入a
时,循环体运行两次(针对'a'
和'\n'
),因此输出为01
。注意:你的代码应该看起来更像这样,使用现代C风格: