c++ - 輸出換行 - endl \n




“\ n”或'\ n'或std:: endl到std:: cout? (4)

std::endl刷新流。 當你想要發生的事情 - 例如,因為你期望你的輸出能夠及時被用戶看到 - 你應該使用std::endl而不是寫入'\n'到流中(無論是作為一個孤立的字符或字符串的一部分)。

有時,你可以離開,而不必自己清理流; 例如,在Linux環境中,如果coutSTDOUT同步(這是默認設置)並正在寫入終端,則默認情況下,該流將被行緩衝,並且每次寫入新行時都會自動刷新。

然而,依靠這種行為是有風險的。 例如在同一個linux環境下,如果你決定運行你的程序時stdout被重定向到一個文件或者管道到另一個進程,那麼默認情況下,流將被緩衝區緩衝

同樣,如果你以後決定關閉與stdio的同步(例如,為了提高效率),那麼實現將傾向於使用iostream的緩衝機制,該機制沒有行緩沖模式。

由於這個錯誤,我看到了很多浪費的生產力; 如果輸出在寫入時應該是可見的,那麼你應該明確地使用std::endl (或使用std::flushstd::ostream::flush ,但我通常會發現std::endl更方便),或者確保刷新足夠頻繁發生的其他事情,比如將stdout配置為行緩衝(假設足夠)。

這個問題在這裡已經有了答案:

自從我寫std::cout時停止使用std::endl來結束行,並開始使用"\n"代替以來,這已經很多年了。

但是現在我開始看到更多使用'\n'的代碼片段,而我開始懷疑什麼可能是最好的。

除了顯而易見的是一個是字符串,另一個是字符,使用它還有什麼好處:

std::cout << variable << '\n';

在此:

std::cout << variable << "\n";

後期添加:

當我問這個問題時,我似乎認為換行符'\n'沖洗了緩衝區。 現在我知道這取決於

默認情況下, std::cin綁定到舊的stdin FILE*流,而std::cout綁定到stdout 。 換行符的沖洗來自於此搭售。 默認情況下, stdout (如果連接到終端)是行緩衝的。 這意味著一條新線將沖洗緩衝區。 所以當使用std::cout打印換行符時,會導致stdout被刷新。

如果stdout未連接到終端(例如輸出已被重定向或管道),或者如果std::coutstdout之間的聯繫中斷,則換行符不會刷新任何內容。


他們做不同的事情。 "\n"輸出換行符(在適當的特定於平台的表示形式中,它會在Windows上生成一個"\r\n" ),但std::endl執行相同的操作並刷新流 。 通常情況下,你不需要立即刷新數據流,它只會花費你的性能,所以大多數情況下沒有理由使用std::endl


沒有最好的。 你使用你需要的東西:

  • '\ n' - 結束該行
  • “一些字符串\ n” - 結束了一些字符串後的行
  • std::endl - 結束行並刷新流

編輯:我的回答差勁很大,這可能導致人們相信我認為“\ n”實際上打印了一個空字符。 這當然是錯誤的:)

編輯2:看過C ++的引用, char無論如何都是通過引用傳遞的,所以這裡沒有區別。 唯一的區別是,必須搜索cstring來定界字符。 由於這個事實,下面的內容不正確。

'\n''\n'稍微更有效一些,因為後者在結尾還包含一個空字符,這意味著你發送一個char*operator<<() (通常是一個4字節的32位系統),而不是char的單個字節。

實際上,這是無關緊要的。 就我個人而言,我遵循弗拉基米爾概述的慣例。*





character