cout和printf的缓冲区和输出序列

cout和printf的缓冲区和输出序列,printf,buffer,cout,Printf,Buffer,Cout,我知道cout和printf现在有缓冲区,据说缓冲区就像一个堆栈,从右到左获取cout和printf的输出,然后从上到下将它们输出(到控制台或文件)。像这样, a = 1; b = 2; c = 3; cout<<a<<b<<c<<endl; buffer:|3|2|1|<- (take “<-” as a poniter) output:|3|2|<- (output 1) |3|<-

我知道cout和printf现在有缓冲区,据说缓冲区就像一个堆栈,从右到左获取cout和printf的输出,然后从上到下将它们输出(到控制台或文件)。像这样,

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

output:|3|2|<-     (output 1)
        |3|<-       (output 2)
        |<-         (output 3)
在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++初级读本+》,据说cout是从左到右工作的,每次返回一个对象(cout),所以“这就是通过插入连接输出的功能”。但从左到右的方法不能解释cout现在我不知道库特的缓冲区是怎么工作的,有人能帮我吗

这不是一个bug,也与输出缓冲无关

i--
i++
操作作为同一函数调用的参数多次调用时,不会定义它们的执行顺序

为了详细说明(并可能纠正)Iraimbilanja对“序列点”的提及,
cout
版本相当于:

(((cout << a) << b) << c)

这不是一个bug,也与输出缓冲无关

i--
i++
操作作为同一函数调用的参数多次调用时,不会定义它们的执行顺序

为了详细说明(并可能纠正)Iraimbilanja对“序列点”的提及,
cout
版本相当于:

(((cout << a) << b) << c)
((cout输出:

printf("i=%d i++=%d i--=%d\n" , i , i++ ,i-- );
这是C++的一个常见陷阱:参数求值顺序未指定

cout情况并非如此:它使用链式调用(序列点),而不是单个函数的参数,因此计算顺序从左到右定义良好

编辑:David Thornley指出,上述代码的行为实际上是

的输出:

printf("i=%d i++=%d i--=%d\n" , i , i++ ,i-- );
这是C++的一个常见陷阱:参数求值顺序未指定

cout情况并非如此:它使用链式调用(序列点),而不是单个函数的参数,因此计算顺序从左到右定义良好


编辑:David Thornley指出,上述代码的行为实际上是

如果可能,请尝试更新到gcc>=4。我刚刚在4.0.1上运行了这个,它执行得非常好。

如果可能,请尝试更新到gcc>=4。我刚刚在4.0.1上运行了这个,它执行得非常好。

它比未指定的更糟糕;它是未定义。无法保证结果将匹配任何评估顺序,尽管这通常是给定明显实现的情况。但是,对于cout案例的解释为+1。它比未指定更糟糕;它是未定义的。无法保证结果将匹配任何评估顺序,尽管这是我们考虑到明显的实现,实际会发生什么。然而,+1用于解释cout情况。虽然gcc 3.x非常古老,一般来说更新可能是个好主意,但在这种情况下,关键是没有一个结果是“正确的”第一,它只是未指定的,依赖未指定的行为可能会从一个编译器版本更改到下一个编译器版本。鉴于这是未定义的行为,(a)根据标准,任何行为都只是花花公子,(b)您不知道它是否会在任何其他版本、任何其他编译器选项或任何其他周围代码上提供您期望的行为。虽然gcc 3.x非常古老,一般来说更新可能是一个好主意,但在这种情况下,关键是没有一个结果是“正确的”第一,它只是未指定的,依赖未指定的行为可能会从一个编译器版本更改到下一个编译器版本。鉴于这是未定义的行为,(a)根据标准,任何行为都只是花花公子,(b)您不知道它是否会在任何其他版本、任何其他编译器选项或任何其他周围代码上提供您期望的行为。嗨,Alnitak,我有一个问题,我认为cout buffer从右到左获取输出,然后也从右到左输出。但我认为在您的代码中,cout buffer从左到右获取输出对,是真的吗?谢谢~在g++中,我无法解释差异,但我对我展示的从左到右的嵌套很有信心。函数是ostream&operatorI请看一下“C++初级读本Plus”,据说从左到右的嵌套是正确的。但我认为从左到右的方式无法解释coutgood点-我已经改变了我的解释,我认为它现在是一致的,解释了你的结果,但也与公认的答案相矛盾。嗨,Alnitak,我有一个问题,我认为缓冲区可以从右到左获得输出,然后将它们也是从右到左。但我认为在你的代码中,cout缓冲区从左到右得到输出,是真的吗?谢谢~在g++中,cout我无法解释差异,但我对我展示的从左到右嵌套很有信心。函数是ostream&operatorI看看“C++Primer Plus”,据说从左到右的嵌套是正确的。但我认为从左到右的方式不能解释coutgood点-我改变了我的解释,我认为它现在是一致的,解释了你的结果,但也与公认的答案相矛盾。
printf("i=%d i++=%d i--=%d\n" , i , i++ ,i-- );