C 为什么程序不执行最终的printf语句?

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循环之后

为什么第三个
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);