gpt4 book ai didi

c++ - 在表达式中调用具有副作用的函数

转载 作者:可可西里 更新时间:2023-11-01 18:35:31 25 4
gpt4 key购买 nike

我以为我了解序列点在 C++ 中的工作方式,但是 this GeeksQuiz question迷惑我:

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;
}

这个问题的“正确”答案是它打印 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。

n4140 §1.9 [intro.execution]/15

Except where noted, evaluations of operands of individual operators and of subexpressions of individual expressions are unsequenced. [...] If a side effect on a scalar object is unsequenced relative to [...] value computation using the value of the same scalar object [...] the behavior is undefined.

乘法运算符没有明确指出顺序。

关于c++ - 在表达式中调用具有副作用的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39914342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com