(--n)是否相等(n - 1)?

pic*_*323 2 c unary-operator decrement

我最近开始尝试学习C&正在做一个涉及创建递归因子函数的练习.为什么以下打印出24的答案?

#include <stdio.h>

int factorial(int n);

int main(void)
{
    int n = 5;
    printf("%d\n", factorial(n));
    return 0;
}


int factorial(int n)
{
    if (n <= 1)
        return 1;
    else
        return n * factorial(--n);
}
Run Code Online (Sandbox Code Playgroud)

如果我将最后一行更改为

return n*factorial(n - 1);

我得到预期的120.

我明白你不能使用n-- b/c它只会在处理完行后减少n,但是--n为什么会给出24?

Cal*_*leb 7

什么是错的--n和为什么它会给24?

问题是--n修改n,所以你的线

return n * factorial(--n);
Run Code Online (Sandbox Code Playgroud)

可评价如下:

return (n - 1) * factorial(n - 1);
Run Code Online (Sandbox Code Playgroud)

因为在表达式的第一个词factorial(--n)之前进行了评估n.另一方面,第一个术语可以在第二个术语之前进行评估,并且您将获得预期的结果.或者,可能会发生完全不同的事情,因为(正如MM和David C. Rankin在评论中指出的那样)当您尝试使用变量并在同一表达式中修改它时会发生什么是未定义的:

如果相对于对同一标量对象的不同副作用或使用相同标量对象的值进行值计算,对标量对象的副作用未被排序,则行为未定义.

那么让我们来解决你的标题问题:

(--n)是否相等(n - 1)?

的值--n和的n - 1是相同的,但前者表达具有其修饰的副作用n.你应该把它--n当作表达的简写(n = n - 1).

  • 实际上它是未定义的行为 (5认同)