(--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)?
--n
和n - 1
的值是一样的,但是前面的表达式有副作用,它修改了n
。对于表达式 (n = n - 1)
.
,您真的应该将 --n
视为 shorthand
我最近开始尝试学习 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)?
--n
和n - 1
的值是一样的,但是前面的表达式有副作用,它修改了n
。对于表达式 (n = n - 1)
.
--n
视为 shorthand