cout是有緩衝輸出:
cout < < "abc " < 或cout < < "abc\n ";cout < endl相當於輸出回車後,再強迫緩衝輸出。
flush立即強迫緩衝輸出。
printf是無緩衝輸出。有輸出時立即輸出。
cout和printf混合使用時,cout後立即強迫緩衝輸出就可以了。
之前對於cout與printf()混用的結果的認識,源於某年北京賽區某judge的總結。據其稱,某隊在比賽時某題的輸出混用了cout與printf(),結果輸出的順序出錯。其把原因歸結為乙個帶緩衝而乙個不帶緩衝。
對此金強提出了置疑,因為stdio.h中定義了像ungetc()這樣的函式,其作用是將字元放回到輸入流中。可見stdio中也是使用了緩衝的。
那麼為什麼cout與printf()混用會發生問題呢?
下面來做一些試驗(環境:g++ (gcc) 3.2.3 (mingw special 20030504-1))。
#include using namespace std;
int main()
輸出為:
aaabbb
沒有問題。
如果將程式修改一下:
#include using namespace std;
int main()
輸出成了:
bbbaaa
順序發生了錯誤。
sync_with_stdio()是在中定義的,當其接受true作為引數時,將會同步iostream與stdio中的流操作。預設是true,因此第乙個程式的結果是正確的。然而,儘管c++標準中規定stdio sync標誌預設是true,不同平台下的不同編譯器可能並不完全支援這個標準。
因此也就有了通常意義上的關於「不要混用iostream與stdio」之類的警告。
如果再修改一下程式:
#include using namespace std;
int main()
這回程式的輸出就又正確了。因為flush強制清空了緩衝區,將其中的內容輸出。
printf的格式控制的完整格式
0 m.n l或h 格式字元 下面對組成格式說明的各項加以說明 表示格式說明的起始符號,不可缺少。有 表示左對齊輸出,如省略表示右對齊輸出。0 有0表示指定空位填0,如省略表示指定空位不填。m.n m指域寬,即對應的輸出項在輸出裝置上所佔的字元數。n指精度。用於說明輸出的實型數的小數字數。為指定n時...
Begoingto與will的區別
語法 一般將來時態 a.be going to 與will的區別 1.相同點 都可以表示將要發生的事,將要去做的事。2.不同點 1 be going to 表近期,眼下就要發生的事情 will 表將來時間則較遠一些。2 be going to 表根據主觀判斷將來肯定要發生的事 will 表客觀上將來...
begoingto與will的區別
be going to 中的be是助動詞,它有am,is,are三種形式,沒有什麼實際意義 to是動詞不定式的標誌詞,標誌詞後動詞用原形。它們三個總是形影不離,在句中共同表達 計畫 打算 準備去做 的意思。如 i am going to sell this old car,and buy a new...