2014-02-13 50 views
0
#include <iostream> 

using namespace std; 

int main() 
{ 
    for (int i = 0; i < 40; ++i) 
    { 
    unsigned long long j = 0; 
    while(j++ <= 10000000); 
    cout<<"A"; 
    } 
    cout<<"\n"; 
    return 0; 
} 

在運行這段代碼有打印的第一「A」之前是一個小的時間間隔之前,所有其它A得到印在那之後立即。有人可以向我解釋爲什麼會發生這種情況?爲什麼不C++程序等待第二次迭代秒像它爲第一次重複打印字符

+2

您確定最初的延遲不僅僅是程序啓動的延遲嗎?嘗試在main()的入口點之後立即放置一個cout語句,看看它和第一個'A'之間是否有明顯的延遲。如果你正在構建一個優化版本,我希望優化器擺脫延遲循環。 – mattnewport

+0

是的,我也檢查過。入口處的cout立即被打印,然後第二個延遲,然後立即打印40'A –

+2

無用的while循環是嘗試實現「睡眠」功能的可怕方法。你的編譯器可能完全消除它。 –

回答

3

C++中的輸出是緩衝。這意味着,當緩衝區已滿或程序結束時,或者流被刷新時(例如,endl),一組字符被收集在一起並同時輸出。

+1

在現代處理器上加上10e6的循環將不會花費人類可察覺的時間量。 –

+1

您也可以使用'flush'來沖洗它,而不會產生任何其他副作用。 –

+0

@MikeSeymour:是的,沖洗緩衝區沒用。它是一次打印所有字符的緩衝輸出。謝謝。 –

0

編譯器會看到你的j。它看到你對j做了什麼。它看到你永遠不會使用j。所以它只是跳過與j一起做的任何事情。你想使用睡眠功能

tl; dr;編譯器超越你的錯誤代碼。

+1

關閉優化總是可能的,這是我相信調試版本的默認設置。 –

相關問題