3

カスタムスタッククラスがあります。ほとんどのコードはここで見ることができます:
引数としてテンプレート型をとるテンプレート化されたクラスのメンバー関数

私は次のようにスタックを埋めます:

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、これは明らかに私が欲しいものです。

それで、何が得られますか?

4

3 に答える 3

7

関数呼び出しの評価の順序は指定されていません。あなたの最初の表現は基本的にこれに要約されます:

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

、、、およびのそれぞれはabへの呼び出しです。コンパイラーは、選択した任意の順序でこれらの呼び出しを評価するコードを生成できます。 cdAstack.Pop()

式の一部の評価の特定の順序に依存する式を作成することは避けてください。一般的に、それは安全ではありません(そして、それが安全であるときでさえ、それは通常かなり混乱します)。

于 2011-03-01T04:49:35.743 に答える
1

最初のバージョンでは、引数coutは右から左に評価されます。実際に評価する順序を指定することはないため、右側の順序が最初に評価され、4がポップされます。

于 2011-03-01T04:48:50.043 に答える
1

ISOC++標準で定義されている不特定の動作として知られているものがあります。コードスニペットはその一例にすぎません。

于 2011-03-01T04:49:19.270 に答える