我将跳过标题
class X {
int i;
static int j;
public:
X(int ii = 1) : i(ii) {
j = i;
}
static int incr() {
return ++j;
}
static int f() {
return incr();
}
};
int _tmain(int argc, _TCHAR* argv[]) {
X x;
X* xp = &x;
cout << x.f() << xp->f() << X::f();
return 1;
}
该序列打印 432,但乍一看可能会认为它会打印 234。
如何确定函数调用的确切顺序?我缺少什么?
§ 1.9.13
排序之前是由单个执行的评估之间的不对称、传递、成对关系
线程(1.10),它在这些评估之间产生偏序。给定任意两个评估 A 和 B,如果
A 排序在 B 之前,则 A 的执行应先于 B 的执行。如果 A 没有排序在 B 之前
B 和 B 未在 A 之前排序,则 A 和 B 未排序。 [ 注意:未排序的执行
评估可能会重叠。 —尾注] 当任一 A 时,评估 A 和 B 的顺序是不确定的
在 B 之前排序,或者 B 在 A 之前排序,但未指定是哪一个。 [注:不确定
顺序评估不能重叠,但可以先执行其中一个。 ——尾注]
换句话说,函数的调用顺序是未定义的。这并不意味着“我们不知道”,也不意味着“你无法解决它”——这意味着它被定义为没有定义;编译器和CPU可以自由地以任何顺序完成它们。
考虑以下:
int a[3];
void f1() { a[0] = 1; }
void f2() { a[1] = 2; }
void f3() { a[2] = 3; }
int main() {
f1(), f2(), f3();
}
基本上,该语言不要求对类似这样的语句进行排序
std::cout << f1() << f2() << f3();
您的代码没有序列点(http://en.wikipedia.org/wiki/Sequence_point) 函数调用之间;您可以计算出编译器生成的顺序,但它在不同的 CPU 或不同的优化级别上的行为可能有所不同。
如果您有这样的可变函数调用,则需要手动提升或添加中断:
std::cout << f1();
std::cout << f2();
std::cout << f3();
or
auto a1 = f1();
auto a2 = f2();
auto a3 = f3();
std::cout << a1 << a2 << a3;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)