2010-01-24 97 views
23

下面的代碼:cout <<打印功能的調用順序?

myQueue.enqueue('a'); 
myQueue.enqueue('b'); 
cout << myQueue.dequeue() << myQueue.dequeue(); 

打印 「八」 到控制檯

同時:

myQueue.enqueue('a'); 
myQueue.enqueue('b'); 
cout << myQueue.dequeue(); 
cout << myQueue.dequeue(); 

打印 「AB」 這是爲什麼?

看起來好像cout最先調用最靠外的(最接近;)函數並且正在工作,它的行爲方式是什麼?

+0

所有答案都在哪裏去了?現在只有一個? – finiteloop 2010-01-24 22:53:27

+1

回答者刪除了他們,因爲他們意識到他們錯了。 – 2010-01-24 22:54:55

+1

有些人在發現錯誤時會刪除答案。 – 2010-01-24 22:55:40

回答

28

運算符<<沒有序列點,因此編譯器可以自由地首先評估dequeue函數。保證的是第二個dequeue調用的結果(按其出現在表達式中的順序,而不一定是它的評估順序)是<<'<<'的結果(如果你得到我說的)。

所以編譯器可以自由地將你的代碼翻譯成任何這些東西(僞中間C++)。這並不是一個詳盡的清單。

auto tmp2 = myQueue.dequeue(); 
auto tmp1 = myQueue.dequeue(); 
std::ostream& tmp3 = cout << tmp1; 
tmp3 << tmp2; 

auto tmp1 = myQueue.dequeue(); 
auto tmp2 = myQueue.dequeue(); 
std::ostream& tmp3 = cout << tmp1; 
tmp3 << tmp2; 

auto tmp1 = myQueue.dequeue(); 
std::ostream& tmp3 = cout << tmp1; 
auto tmp2 = myQueue.dequeue(); 
tmp3 << tmp2; 

下面介紹一下臨時工對應於原始表達式。

cout << myQueue.dequeue() << myQueue.dequeue(); 
|  |    | |    | 
|  |____ tmp1 _____| |_____ tmp2 ____| 
|      | 
|________ tmp3 _________| 
+0

因此,在頂部的例子中, std :: ostream&tmp3 = cout << tmp1; tmp3 << tmp2; 就像在說「cout << tmp1 << tmp2;」?或者我錯過了什麼? – finiteloop 2010-01-24 22:57:37

+0

@segfault:是的,因爲這是'''在C++語法中關聯的方式。 'a << b << c'總是分組爲'(a << b)<< c'。 – 2010-01-24 23:03:16

+0

但是通過這種邏輯,不會說cout << a << b是說(cout << a)<< b並且做任何必要的事情來關閉第一個(即調用myQueue.dequeue())? – finiteloop 2010-01-24 23:07:39

6

從你的榜樣召喚:

cout << myQueue.dequeue() << myQueue.dequeue(); 

轉換爲下面的表達operator<<功能的兩個電話:

operator<<(operator<<(cout, myQueue.dequeue()), myQueue.dequeue()); 
-------------------- 1 
---------2 

cout評價的順序,myQueue.dequeue()是不確定的。但是,operator<<函數調用的順序已詳細說明,如標記爲12

相關問題