【发布时间】:2013-06-01 21:31:36
【问题描述】:
我正在学习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() 时,它不会立即切换数组的两个元素,但后来我检查了一下,它已经切换了.
你能帮我理解这种行为吗?谢谢。
【问题讨论】:
-
请允许我建议您的问题与此问题(以及许多类似问题)重复:stackoverflow.com/questions/10782863/…
-
@jogojapan - 这不是那个问题的重复,因为有一个函数调用会引入一个序列点。
-
@PeteBecker 正如您在回答中所说,这两个评估是无序的(相对于彼此)。由于两者之一对另一个读取的左值有副作用,因此与重复问题中描述的基本情况相同。
-
@jogojapan - 它们不是无序的。它们的序列不确定。
-
@PeteBecker 在 1.9/15 C++11 中有一条注释,在函数调用的参数评估上下文中:与不同参数表达式相关的值计算和副作用是无序的我>。它在那里说unsequenced。
标签: c++