c++ - 輸出換行 - endl \n
“\ n”或'\ n'或std:: endl到std:: cout? (4)
這個問題在這裡已經有了答案:
自從我寫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::cout
和stdout
之間的聯繫中斷,則換行符不會刷新任何內容。
std::endl
刷新流。 當你想要發生的事情 - 例如,因為你期望你的輸出能夠及時被用戶看到 - 你應該使用std::endl
而不是寫入'\n'
到流中(無論是作為一個孤立的字符或字符串的一部分)。
有時,你可以離開,而不必自己清理流; 例如,在Linux環境中,如果cout
與STDOUT
同步(這是默認設置)並正在寫入終端,則默認情況下,該流將被行緩衝,並且每次寫入新行時都會自動刷新。
然而,依靠這種行為是有風險的。 例如在同一個linux環境下,如果你決定運行你的程序時stdout
被重定向到一個文件或者管道到另一個進程,那麼默認情況下,流將被緩衝區緩衝 。
同樣,如果你以後決定關閉與stdio的同步(例如,為了提高效率),那麼實現將傾向於使用iostream
的緩衝機制,該機制沒有行緩沖模式。
由於這個錯誤,我看到了很多浪費的生產力; 如果輸出在寫入時應該是可見的,那麼你應該明確地使用std::endl
(或使用std::flush
或std::ostream::flush
,但我通常會發現std::endl
更方便),或者確保刷新足夠頻繁發生的其他事情,比如將stdout
配置為行緩衝(假設足夠)。
他們做不同的事情。 "\n"
輸出換行符(在適當的特定於平台的表示形式中,它會在Windows上生成一個"\r\n"
),但std::endl
執行相同的操作並刷新流 。 通常情況下,你不需要立即刷新數據流,它只會花費你的性能,所以大多數情況下沒有理由使用std::endl
。
沒有最好的。 你使用你需要的東西:
- '\ n' - 結束該行
- “一些字符串\ n” - 結束了一些字符串後的行
-
std::endl
- 結束行並刷新流
編輯:我的回答差勁很大,這可能導致人們相信我認為“\ n”實際上打印了一個空字符。 這當然是錯誤的:)
編輯2:看過C ++的引用, char
無論如何都是通過引用傳遞的,所以這裡沒有區別。 唯一的區別是,必須搜索cstring來定界字符。 由於這個事實,下面的內容不正確。
'\n'
比'\n'
稍微更有效一些,因為後者在結尾還包含一個空字符,這意味著你發送一個char*
到operator<<()
(通常是一個4字節的32位系統),而不是char
的單個字節。
實際上,這是無關緊要的。 就我個人而言,我遵循弗拉基米爾概述的慣例。*