我正在学习c ++,最近遇到了一个令人困惑的问题,这是代码:
#include <iostream>
using namespace std;
class A {
public:
A() { a[0] = 1; a[1] = 0; }
int a[2];
int b(void) { int x=a[0];a[0]=a[1];a[1]=x; return x; }
};
int main(void) {
A a;
cout<<a.a[0]<<a.a[1]<<endl; //outputs 10
a.b();
cout<<a.a[0]<<a.a[1]<<endl; //outputs 01
a.b();
cout<<a.a[0]<<a.a[1]<<endl; //outputs 10
cout << a.b() << //outputs 1
endl<< a.a[0]<<a.a[1] << endl; //outputs 10???
cout<<a.a[0]<<a.a[1]<<endl; //outputs 01???
return 0;
}
b()的前两个调用按预期运行,但是当我在cout语句中调用b()时,它不会立即切换数组的两个元素,但稍后我检查它,它已经切换。
你可以帮我理解这种行为吗?谢谢。答案 0 :(得分:4)
std::cout << f() << g();
未指定两个函数调用的评估顺序;编译器可以调用g()
然后调用f()
,也可以调用f()
然后调用g()
。
代码中的内容相同;编译器可以将调用a.a[0]
a.b()
的价值缩小,或者调用a.b()
然后获取a.a[0]
的值。
答案 1 :(得分:0)
表达式中的函数求值取决于编译器流操作,例如<<
和>>
。评估x = f1() + f2()
时会发生相同的问题。您不知道将首先评估哪个,因为它取决于编译器。
在单独的行上调用它们以消除歧义会更安全。