cout與printf的區別

2021-03-03 21:51:40 字數 1007 閱讀 7038

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...