2012-06-30 58 views
0

我不明白爲什麼程序控制沒有達到第三個printf,就在for循環之後。爲什麼程序不執行最終的printf語句?

爲什麼不打印第三個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 
+0

嘗試在最後一個printf中添加換行符。 –

+0

這可能會回答你的問題:http://stackoverflow.com/a/1716621/748875 – Simon

+0

出於興趣:爲什麼'雙'爲NC?當然'int'會更傳統? – LeoNerd

回答

4

它正常工作對我來說,你是如何試圖termintate程序? for -loop應該在getchar()被檢測爲輸入EOF時結束。

EOFControl-Z Linux/Unix下(^Z)在Windows下和Control-D^D)。一旦我輸入,循環終止,我得到最後printf()顯示其輸出。

如(如@DanielFisher也提到)最後要注意,在你最終printf()通話的末尾添加'\n',因爲它可以通過您的具體實現中需要或其他程序的行爲可能是不確定的(感謝@KeithThompson和@AndreyT在評論中指出這一點):

printf ("Why does this work, nc = %f\n", nc); 
+1

尾隨'\ n'不只是文體。它是實現定義的,是否需要尾隨''\ n'' *。如果需要,不提供一個會導致程序的行爲未定義。 –

+1

@KeithThompson有趣的是,你能詳細說明一下這個要求嗎,我之前沒有聽說過這個。它是否會導致輸出緩衝區被刷新? – Levon

+1

@Levon:語言規範在7.19.2/2中對文本流進行了說明:「最後一行是否需要終止換行符是實現定義的。」 – AnT

0

printf被緩衝,這就是爲什麼可以不顯示最後一行。 這意味着對printf的調用可能不會導致直接輸出,因爲函數在將數據放入輸出(您的終端)之前累積數據。

在最後一次printf之後調用fflush會將保留在緩衝區中的所有內容放入終端。而且,每次你要求換行時,緩衝區都會被刷新。

相關問題