《轉》cout和printf的混用而產生的順序問題

2021-09-06 11:43:16 字數 796 閱讀 8240

之前對於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強制清空了緩衝區,將其中的內容輸出。

cout與printf的混用問題

在某題的輸出混用了cout與printf 結果輸出的順序出錯。把原因歸結為乙個帶緩衝而乙個不帶緩衝。因為stdio.h中定義了像ungetc 這樣的函式,其作用是將字元放回到輸入流中。可見stdio中也是使用了緩衝的。那麼為什麼cout與printf 混用會發生問題呢?include using n...

cout和printf的混用而產生的順序問題

之前對於cout與printf 混用的結果的認識,源於某年北京賽區某judge的總結。據其稱,某隊在比賽時某題的輸出混用了cout與printf 結果輸出的順序出錯。其把原因歸結為乙個帶緩衝而乙個不帶緩衝。對此金強提出了置疑,因為stdio.h中定義了像ungetc 這樣的函式,其作用是將字元放回到...

printf和cout右向左求值

p 等價於 p p 1也就是b的值變成3 函式的壓棧順序是從右到左的 當 p 入棧時,編譯器做了如下操作 先為 p 建立乙個臨時變數 b,並做賦值操作,b p 可想而知此時 b的值是 p 也就是2,賦值後 p做了自增操作 p p 1 所以在printf d d n p,p 中的 p入棧時 p已經變成...