2013-02-11 26 views
8

以下のコードでは、呼び出しの順序を理解するのが難しいです。 私は私が手出力は私がコールstd::cout<< b->fooA() << b->fooB() << std::endl演算子の実行順序<<

std::cout.operator<<(b->fooA()).operator<< (b->fooB()) 

を呼び出すことと同等であったと考え

BA12 

であることを確認することができますが

A1B2 

以下の出力を見て期待していましたしかし、私はこれが事実ではないことがわかります。これがどのように機能するのか、グローバルoperator<<との関係を理解するのを手伝ってもらえますか?これは最後にこの順番で呼ばれていますか?

よろしく

AFAG

#include <iostream> 

    struct cbase{ 
     int fooA(){ 
      std::cout<<"A"; 
      return 1; 
     } 
     int fooB(){ 
      std::cout <<"B"; 
      return 2; 
     } 
    }; 

    void printcbase(cbase* b){ 
     std::cout << b->fooA() << b->fooB() << std::endl; 
    } 

    int main(){ 
     cbase b; 
     printcbase(&b); 
    } 
+3

とすることができます。しかし、評価の順序が明確になっているという誤った仮定をしています。ありません。それだけです。 –

+0

ここでは部分式評価の順序は保証されていません(*は*が重複していますが、今は正常な正規の質問を見つけることができません) –

+0

'AB12'または' BA12'は可能な出力です。 'A1B2'は(うまくいけば)できません。 – jrok

答えて

8

コンパイラは、このよう機能printcbase()を評価することができます。

void printcbase(cbase* b){ 
    int a = b->FooA(); // line 1 
    int b = b->FooB(); // line 2 
    std::cout << a;  // line 3 
    std::cout << b;  // line 4 
    stc::cout << std::endl; 
} 

や線の多くpermutatinsのいくつかの1としてマークされて - あなただけです4 1行目は3行目より前に、2行目は4行目よりも前に行なわれていることが保証されています。 Standardはそれ以上のことは言わないし、実際には異なるC++コンパイラで異なる結果が期待できる。

+0

1つの制約がありません。3行目が4行目より前です。 –

+0

これは明らかです。それは私の考えのポイントではありませんでした。私はそれを追加します。ありがとう。 – mity

4

<<の実行順序はよく定義されていますが、サブ式の評価順序はC++では定義されていません。 This article and the C code exampleは、あなたが言及した問題を示しています。

BA12およびAB12はどちらも正しいです。次のコードでは:

std::cout<< b->fooA() << b->fooB() 

12の前に表示されますがコンパイラは、それが最初fooAまたはfooBを評価するかどうかを約束しないためABの前または後に表示されることがあります。

1

シフト演算子は左結合です。 a << b << c(a << b) << cと表示されます。つまり、aのメンバーがユーザー定義のoperator<<のタイプで、そのタイプを返した場合、式はa.operator<<(b).operator<<(c)となります。代わりに空きoperator<<が使用されている場合は、operator<<(operator<<(a, b), c)と表示されます。

だから a << bの評価は (a << b) << cの評価の前に、配列決定されていますが、 bの評価と cの間には、配列決定依存性はありません。

a << b << c[1] 
|   | 
a << b[2] | 
| | c[5] 
a[3] b[4] 

我々は、上記のような副作用に番号を付ける場合は、副作用の順序は、

54321 
53421 
45321 
43521 
43251 
35421 
34521 
34251 
関連する問題