gpt4 book ai didi

c++ - 在递归中使用--a vs a-1

转载 作者:行者123 更新时间:2023-12-01 14:10:36 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Undefined behavior and sequence points

(5 个回答)


去年关闭。




我试图使用这样的递归计算阶乘:

#include <iostream>

using namespace std;

int factorial(int a)
{
if(a == 0)
{
return 1;
}
return a*factorial(--a);
}

int main()
{
int a;
cin >> a;

cout << factorial(a) << endl;

return 0;
}
它不起作用。然后,我做了一个小改动:
#include <iostream>

using namespace std;

int factorial(int a)
{
if(a == 0)
{
return 1;
}
return a*factorial(a-1);
}

int main()
{
int a;
cin >> a;

cout << factorial(a) << endl;

return 0;
}
......它开始工作了!
问题是我看不出这些代码之间有任何区别:为什么它在第一个代码中不起作用?

最佳答案

在您的第一个代码示例中,以下行具有未定义的行为:

return a * factorial(--a);
这是因为 C++ 标准中没有任何内容规定 a 的“旧”还是"new"(递减)值。用于乘以 factorial 的返回值功能。
编译 clang-cl 给出以下内容:

warning : unsequenced modification and access to 'a' [-Wunsequenced]


在您的第二个代码示例中,没有这样的歧义,如 a未修改。

关于c++ - 在递归中使用--a vs a-1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63118774/

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