Ser*_*nov 8 c++ sequence-points
我以为我理解序列点在C++中是如何工作的,但是这个GeeksQuiz问题困惑了我:
int f(int &x, int c) {
c = c - 1;
if (c == 0) return 1;
x = x + 1;
return f(x, c) * x;
}
int main() {
int p = 5;
cout << f(p, p) << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个问题的"正确"答案是它打印6561.事实上,在VS2013中确实如此.但是不管它是UB,因为没有保证会首先评估:f(x, c)或者x.如果f(x, c)首先被评估,我们得到6561 :整个事情变成五个递归调用:前四个(c = 5, 4, 3, 2)继续,最后一个(c = 1)终止并返回1,这9 ** 4最终相当于.
但是,如果x首先进行评估,那么我们就会得到6 * 7 * 8 * 9 * 1.有趣的是,在VS2013甚至取代f(x, c) * x与x * f(x, c)不改变的结果.不是说它意味着什么.
根据标准,这个UB是不是?如果没有,为什么?
这是UB。
\n\n\n\n\nn4140 \xc2\xa71.9 [介绍.执行]/15
\n\n除非另有说明,否则各个运算符的操作数和各个表达式的子表达式的求值都是无序的。[...] 如果标量对象上的副作用相对于使用同一标量对象的值进行值计算而言是无序的,则行为是未定义的。
\n
乘法运算符没有明确指出顺序。
\n