C 为什么程序不执行最终的printf语句?
我不明白为什么程序控制不能到达第三个printf,就在for循环之后 为什么第三个C 为什么程序不执行最终的printf语句?,c,for-loop,terminal,while-loop,printf,C,For Loop,Terminal,While Loop,Printf,我不明白为什么程序控制不能到达第三个printf,就在for循环之后 为什么第三个printf不打印 如果我将for循环更改为while循环,它仍然不会打印 以下是程序和输出: main() { double nc; printf ("Why does this work, nc = %f\n", nc); for (nc = 0; getchar() != EOF; ++nc) { printf ("%.0f\n", nc); }
printf
不打印
如果我将for循环更改为while循环,它仍然不会打印
以下是程序和输出:
main()
{
double nc;
printf ("Why does this work, nc = %f\n", nc);
for (nc = 0; getchar() != EOF; ++nc)
{
printf ("%.0f\n", nc);
}
printf ("Why does this work, nc = %f", nc);
}
输出为:
Why does this work, nc = 0.000000
test
0
1
2
3
4
这对我来说很好,你打算怎么终止这个计划?当
getchar()
检测到EOF
作为输入时,的循环应该结束
EOF
在Windows下是Control-Z
(^Z
),在Linux/Unix下是Control-D
(^D
)。一旦我输入这个,循环终止,我得到最后的printf()
来显示它的输出
最后请注意(正如@DanielFisher所提到的),在最后的printf()
调用末尾添加一个'\n'
,因为它可能是您的特定实现所需要的,否则程序的行为可能是未定义的(感谢@KeithThompson和@AndreyT在注释中指出了这一点):
这对我来说很好,你打算怎么终止这个计划?当getchar()
检测到EOF
作为输入时,
的循环应该结束
EOF
在Windows下是Control-Z
(^Z
),在Linux/Unix下是Control-D
(^D
)。一旦我输入这个,循环终止,我得到最后的printf()
来显示它的输出
最后请注意(正如@DanielFisher所提到的),在最后的printf()
调用末尾添加一个'\n'
,因为它可能是您的特定实现所需要的,否则程序的行为可能是未定义的(感谢@KeithThompson和@AndreyT在注释中指出了这一点):
是缓冲的,这就是为什么最后一行可能不显示的原因。
这意味着调用printf
可能不会导致直接输出,因为函数会在将数据放入输出(终端)之前累积数据
在最后一次printf之后调用将把保留在终端缓冲区中的所有内容放入。此外,每次请求换行时都会刷新缓冲区。已缓冲,因此可能不会显示最后一行。
这意味着调用printf
可能不会导致直接输出,因为函数会在将数据放入输出(终端)之前累积数据
在最后一次printf之后调用将把保留在终端缓冲区中的所有内容放入。此外,每次请求换行时都会刷新缓冲区。尝试将换行添加到最后一次打印F。这可能会回答您的问题:出于兴趣:为什么要使用nc的double
?当然,int
会更传统吗?尝试在最后一个printf中添加一个换行符。这可能会回答您的问题:出于兴趣:为什么对nc使用double
?肯定int
会更传统吗?后面的\n
不仅仅是风格上的。它的实现定义了是否需要尾部的'\n'
。如果需要的话,没有提供一个会使程序的行为无法定义。@KeithThompson很有趣,你能详细说明一下这个要求吗,我以前没听说过。这是否与它是否导致输出缓冲区被刷新有关?@Levon:语言规范在7.19.2/2中规定了文本流:“最后一行是否需要一个终止的新行字符是实现定义的。”为什么选择下行?我很乐意改进答案或更正任何错误,但如果没有解释,OP、SO或我是没有用的。@AndreyT谢谢。。我刚找到它并仔细阅读了一遍。删除了对style:)的所有引用。尾部的\n
不仅仅是文体。它的实现定义了是否需要尾部的'\n'
。如果需要的话,没有提供一个会使程序的行为无法定义。@KeithThompson很有趣,你能详细说明一下这个要求吗,我以前没听说过。这是否与它是否导致输出缓冲区被刷新有关?@Levon:语言规范在7.19.2/2中规定了文本流:“最后一行是否需要一个终止的新行字符是实现定义的。”为什么选择下行?我很乐意改进答案或更正任何错误,但如果没有解释,OP、SO或我是没有用的。@AndreyT谢谢。。我刚找到它并仔细阅读了一遍。删除了对文体的所有引用:)
printf ("Why does this work, nc = %f\n", nc);