[英]Strange outputs of mixed up std::cout
C ++的std :: cout似乎很有趣。 我今天在C ++編譯器上嘗試了以下程序:
cout<<"!"<<"@"<<endl;
cout<<"!"<<cout<<"@"<<endl;
cout<<"!"<<(cout<<"@")<<endl;
輸出非常奇怪:
!@
!0x601068@
@!0x601068
第一行是行人;第二行是行人。 第二個是可以理解的; 但是,第三行是我所不知道的。 有人可以解釋輸出嗎? 謝謝大家!
子耀偉
這行:
cout<<"!"<<(cout<<"@")<<endl;
它首先執行:
(cout << "@")
注意:它可能首先執行了其他操作,但是編譯器優化了該子表達式,發現它可以將其移動到語句的開頭而不會破壞任何約束。
該表達式的結果是流(cout)。 因此,結果表達式為:
cout<<"!"<< cout <<endl;
結果是:
@!<pointer>
括號會像其他表達式一樣影響此處的求值順序(<<是運算符)。 因為該表達式具有副作用 ,所以這些副作用的發生順序與表達式評估的順序相同。
第三行說明了作為插入運算符的語法糖。
本質上,首先計算(cout<<"@")
表達式,導致@
,它返回流cout
本身。
只有這樣!
首先,將表達式發送到cout
。
其等效於:
operator<<( operator<<( operator<<(cout,"!"), ( operator<<(cout,"@") ) ), endl);
^------------------^
突出顯示的部分是一個表達式,必須在調用任何函數之前對其求值。
我的假設-第三行中的括號使cout<<"@"
首先執行,這會將@
放在行的開頭。 然后執行cout.operator<<("!")
,將!
到位。 然后, cout.operator<<("!")
返回的ostream
運行其operator<<()
,該operator<<()
被賦予cout<<"@"
返回的ostream
,從而輸出0x601068
。
如果您理解第二行,那么為什么第三行會使您感到困惑?
首先,對括號中的表達式進行求值(但求值順序未指定),因此@
會寫在標准輸出上; 此類表達式返回對cout
的引用,就像插入操作符總是會發生的那樣,因為否則它們將無法鏈接。
現在已經評估了表達式的這一部分,一切都照常進行:從左到右依次寫出行中的內容:首先是!
,然后從括號中的表達式返回的值(即對cout
的引用,然后對endl
的引用)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.