2011-03-01 93 views
3

我有一個自定義堆棧類。大部分的代碼可以在這裏看到:
Member functions of a templated class, that take a template type as argumentC++ cout自定義堆棧類的奇怪行爲

我填堆像這樣:

stack <int> Astack; 
Astack.Push(1); Astack.Push(2); Astack.Push(3); Astack.Push(4); 

那麼我這樣做:

cout << Astack.Pop() << Astack.Pop() << Astack.Pop() << Astack.Pop() <<endl; 

,並得到這樣的:1234
然而,如果我這樣做:

cout << Astack.Pop(); cout << Astack.Pop(); cout << Astack.Pop(); cout << Astack.Pop(); 

我得到這個:4321,這顯然是我想要的。

那麼,什麼給了?

回答

7

函數調用的評估順序未指定。你的第一個表現基本上可以歸結爲這樣:

cout << a << b << c << d; 

每個abc,並dAstack.Pop()電話。編譯器可以生成代碼,以它選擇的任何順序評估這些調用。

您應該避免編寫依賴於表達式部分評估順序的表達式。一般來說,這是不安全的(甚至當它是安全的時候,它通常很混亂)。

1

在第一個版本中,參數cout從右到左進行評估。你從來沒有真正指定他們應該被評估的順序,所以右邊的那個先被評估,然後彈出4,依此類推。

+0

但是你不能依賴那個順序(或任何其他的);請參閱@詹姆斯的答案。 – 2011-03-01 04:54:46

+0

@Jeremiah:我知道,只是在這種情況下說這就是發生了什麼。 – 2011-03-01 05:00:21

+0

這是發生在這種情況下,我想澄清它,所以其他人不會認爲這是總是發生。 – 2011-03-01 05:02:34

1

有一些被稱爲ISO C++標準定義的未指定行爲。你的代碼片段就是一個例子。