1

今日、cout と printf にはバッファがあることを知っています。バッファはスタックのようなもので、cout と printf の出力を右から左に取得し、(コンソールまたはファイルに)上から下に出力すると言われています。このような、

a = 1; b = 2; c = 3;
cout<<a<<b<<c<<endl;
buffer:|3|2|1|<-   (take “&lt;-” as a poniter)

output:|3|2|<-     (output 1)
        |3|<-       (output 2)
        |<-         (output 3)

次に、以下のコードを記述します。

#include <iostream> 
using namespace std; 
int c = 6;
int f() 
{   
    c+=1; 
    return c; 
} 

int main() 
{ 
     int i = 0; 
     cout <<"i="<<i<<" i++="<<i++<<" i--="<<i--<<endl; 
     i = 0;
     printf("i=%d i++=%d i--=%d\n" , i , i++ ,i-- );

     cout<<f()<<" "<<f()<<" "<<f()<<endl; 
     c = 6;
     printf("%d %d %d\n" , f() , f() ,f() );
     system("pause");
     return 0; 
} 

VS2005では、出力は

i=0 i++=-1 i--=0
i=0 i++=-1 i--=0
9 8 7
9 8 7

g++( (GCC) 3.4.2 (mingw-special)) の下では、出力は次のようになります。

i=0 i++=0 i--=1
i=0 i++=-1 i--=0
9 8 7
9 8 7

バッファはスタックのようです。ただ、今日C++ Primer Plusを読んでみると、coutは左から右に働き、毎回オブジェクト(cout)を返すと書いてあるので、「挿入で出力を連結できる機能ですね」。しかし、左から右への方法では cout< 出力 9 8 7 を説明できません。今、cout のバッファの仕組みについて混乱しています。誰か助けてもらえますか?

4

3 に答える 3

6

次の出力:

printf("i=%d i++=%d i--=%d\n" , i , i++ ,i-- );

未指定です。これは C++ の一般的な落とし穴です。引数の評価順序が指定されていません。

cout の場合はそうではありません。単一の関数への引数ではなく、連鎖呼び出し (シーケンス ポイント) を使用するため、評価順序は左から右に明確に定義されます。

編集: David Thornley は、上記のコードの動作が実際にはundefinedであることを指摘しています。

于 2009-03-18T17:21:30.887 に答える
0

可能であれば、gcc >= 4 に更新してみてください。これを 4.0.1 で実行したところ、ただ dandy が実行されました。

于 2009-03-18T17:31:59.397 に答える