2012-03-14 72 views
2

在將此問題聲明爲thisthat的副本之前,請考慮我已將問題提交到the online judge\n並得到WA,然後與std::endl並獲得AC。所以,我需要一個非常具體的答案,平臺意識\n真的是平臺意識到,運行時是否真的根據平臺編寫正確的行結尾作爲其他問題的答案聲稱?如果是這樣,你能告訴我這是怎麼發生的?std :: endl和 n之間的區別

如果答案可以通過關於平臺意識問題的標準引用來支持,我會非常感激。我讀過所有其他問題的答案(即使是封閉的答案),所以請不要重複「沖洗緩衝區」的東西。

+0

什麼是WA和AC? – 2012-03-14 09:44:48

+0

WA =錯誤答案,AC =接受。這顯然意味着 - 法官服務器上的文件輸出有所不同。 – OmarOthman 2012-03-14 09:46:52

+0

如果您使用\ n,然後在最後執行std :: cout << std :: flush',則可能會接受您的答案。你嘗試過嗎? – 2012-03-14 09:59:40

回答

5

C++11從,§27.7.3.8 -

namespace std 
{ 
    template <class charT, class traits> 
     basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os); 
} 

效果:調用os.put(os.widen(」 \ n」)),然後os.flush()。

返回:os。

所以,從標準很顯然,endl刷新輸出流緩衝區,而\n沒有。通常,您會希望使用endl來打印新行,但是您還應該記住,每次執行此操作時,輸出緩衝區也會被刷新。

關於平臺意識

從標準很明顯,兩者不完全一樣的事情 - 印刷在完全相同的方式一個新行。所以,如果一個平臺是獨立的,那麼另一個也應該是相同的。因爲我知道endl是獨立於平臺的,所以\n的情況也是如此。

+0

有一點點,但是'endl'沒有「清除」輸出流,它會刷新它。在標準內,至少,「清除」流意味着重置其錯誤位,而不是清除它。 – 2012-03-14 10:06:07

+0

@JamesKanze:是的,這就是我想表達的意思,只是用了錯誤的詞:-)。現在已經修復:-)。 – 2012-03-14 10:08:01

+1

令人懊惱的是,N3092(官方標準之前的最終版本)爲27.7.2.8,N3337(之後的第一版)爲27.7.3.8,因爲該概覽在最終草稿中沒有得到數字。我沒有實際的標準,所以這是一個痛苦的發現......哦,不得不接受它或支付適當的版本。 – BoBTFish 2012-03-14 11:35:58

5

std::endl是一個輸出'\n'的機械手,然後刷新流。對於大多數隨意使用,這是你應該使用的。但是,輸出大量數據時,可能會導致顯着的性能下降,在這種情況下,請使用'\n'

編輯:

關於平臺意識:兩個輸出完全一樣的東西。如果流在文本模式下打開,則'\n'將導致依賴於平臺的表示形式結束:Unix下的0x0A,Windows下的0x0D,0x0A,在某些大型機下啓動新記錄等。如果流在二進制模式下,它將導致輸出單個字節(通常爲0x0A,但實際上取決於使用的基本字符編碼)。

+0

爲了響應您的編輯,我已經將兩個程序的輸出(使用endl和\ n)寫入兩個文件,並使用KDiff3進行了比較。它聲明兩者都是*二進制平等*!我真的不知道發生了什麼......我開始真的懷疑這個問題是從裁判那邊來的! – OmarOthman 2012-03-14 10:27:41

+0

無論你使用'\ n''或者'std :: endl'對輸出的內容都沒有影響。唯一的區別是flush:''\ n'',任何前面的輸出都會立即用'std :: endl'出現;它可能會(可能)會比''\ n''更晚出現---如果程序在此期間崩潰,或者永遠不會。 (這是爲什麼大多數「隨便」寫法都應該更喜歡'std :: endl'的原因。) – 2012-03-14 10:38:34

相關問題