在逛论坛的时候发现这个问题的,然后就动手查了下,也写了下代码测试
不过首先应该声明的是 : c++中对于cout后面的表达式的求值顺序是未定义的,具体的运行结果要由编译器的实现来决定.
本人是在vc++ 6.0下编译的.
测试代码:
#include <iostream>
using namespace std;
int fun() {
static int xx = 0;
++xx;
return xx;
}
int main(void) {
int a=1, b=2, c=3;
char x, y;
cout << a << b << c << endl;
cout << fun() << fun() << fun() << endl;
cout << (x = getchar()) << (y = getchar()) << endl;
return 0;
}
输出结果: 123 (第一个cout语句)
321 (第二个cout语句)
因为在我所用的编译器下 cout后的表达式求值是从右向左的, 所以从右向左三个fun()函数的值分别是1, 2, 3
三个fun函数执行后的结果入栈. 如图:
然后从栈顶取值, 输出 3 2 1
同样的对于getchar的例子,
如果输入的是 ab , 先从右边的getchar()函数开始读取, 因面右边的读的是a, 左边的读的是b, 入栈后
输出时从栈顶依次取值, 输出 b a
总结:1 该现象在c++标准中是未定义行为, 运行结果完全取决于编译器实现
2 在6.0中是先从右向左计算各表达式的值后入栈, 然后从栈顶取值输出.
3 此规则也适用于其它的一些输出函数或表达式.