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

Does (--n) equal (n - 1)?

我最近开始尝试学习 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);
}

如果我将最后一行更改为

return n * factorial(n - 1);

我得到了预期的 120。

我知道你不能使用 n-- b/c 它只会在处理该行后减少 n 但 --n 有什么问题 & 为什么它给出 24?

whats wrong with --n & why does it give 24?

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

return n * factorial(--n);

可能会这样评价:

return (n - 1) * factorial(n - 1);

因为 factorial(--n) 在表达式的第一项 n 之前求值。另一方面,第一项可以在第二项之前评估,您会得到预期的结果。或者,可能会发生完全不同的事情,因为(正如 M.M 和 David C. Rankin 在评论中指出的那样)当您尝试使用变量并在同一表达式中修改它时会发生什么 is undefined:

If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined.

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

Does (--n) equal (n - 1)?

--nn - 1的值是一样的,但是前面的表达式有副作用,它修改了n。对于表达式 (n = n - 1).

,您真的应该将 --n 视为 shorthand