簡體   English   中英

混合std :: cout的奇怪輸出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM