#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++)的求值。因此这个语句的结果依赖于编译器如何实现,是未定义的。出现什么结果都不奇怪。