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

时间:2018-03-23 04:25:45

标签: c decrement unary-operator

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

如果我将最后一行更改为

  

返回n * factorial(n - 1);

我得到预期的120。

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

1 个答案:

答案 0 :(得分:7)

  

什么是错的--n&amp;为什么它会给24?

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

return n * factorial(--n);

可能评估如下:

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

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

  

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

所以,让我们解决你的标题问题:

  

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

--nn - 1的值相同,但前一个表达式具有修饰n的副作用。您应该认为--n是表达式(n = n - 1)的缩写。