关于C++ 输出流顺序的问题,请看以下程序代码:

#include <iostream>
using namespace std;
static int a[ ]={1, 3,5, 7, 11, 13};
void main(void)
{ int *p;
p=a+3;
cout<<*p<<'\t'<<(*p++)<<endl;
cout<<*(p-2)<<'\t'<<*(a+4)<<endl;
}
/* 输出结果 :11 7
5 11
我的问题就是第一个cout语句,既然是从左至右输出,为什么不是 7 7 而是11 7 呢?

*/

从左至右只是运算符的结合律,而运算符的优先级和结合律只是规定运算对象的组合方式,对求值顺序没有规定。

引用《C++ Primer》上的一个例子来说明:

在一条形如f()+g()*h()+j()的表达式中:

    优先级规定,g()的返回值和h()的返回值相乘。

    结合律规定,f()的返回值先与g()和h()的乘积相加,所得结果再与j()的返回值相加。

    对于这些函数的调用顺序没有明确规定。


回到这个语句cout<<*p<<'\t'<<(*p++)<<endl;

由于C++标准没有规定求值顺序,程序可能先求值(*p++),也可能先求值(*p),甚至还可能先执行(*p++),求到一半再执行(*p),最后回过头来完成(*p++)的求值。因此这个语句的结果依赖于编译器如何实现,是未定义的。出现什么结果都不奇怪。

温馨提示:答案为网友推荐,仅供参考
相似回答