函数调用误解

时间:2018-07-02 08:35:57

标签: c++ c

例如,我有一个计算n!的递归函数。

 int fact(int n){
 if(n==1)
   return 1;
return n*fact(n-1);
}

我的问题是为什么我不能将n-1替换为n-?

2 个答案:

答案 0 :(得分:4)

有两个原因。

一个,n--是递减的。用作折旧的值应为n的原始值(非递减值)。

两个,n在表达式中使用两次(一次作为*的左侧参数,一次在递归调用的参数中)。在这种情况下,C和C ++都没有指定评估顺序,因此不清楚n是在n--(甚至是--n之前还是之后)进行评估。

答案 1 :(得分:3)

因为它更改了n的值。由于该值用于计算表达式n * fact(...),因此必须在对n求值后 读取fact的值。由于必须将--n(或n--,在这里无关紧要)作为值传递给fact,因此减量必须发生在fact之前被调用。因此,表达式结果将是错误的。