Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 函数调用误解_C - Fatal编程技术网

C 函数调用误解

C 函数调用误解,c,C,例如,我有一个递归函数,它计算n int fact(int n){ if(n==1) return 1; return n*fact(n-1); } 我的问题是为什么我不能用n--替换n-1?或者我可以用--n替换它吗?因为它更改了n的值。由于该值用于计算表达式n*fact(…),因此必须在计算fact后读取n的值。由于必须将--n(或n--,此处无所谓)作为值传递给fact,因此减量必须在调用fact之前发生。因此,表达式结果将不正确。有两个原因 第一,n--

例如,我有一个递归函数,它计算n

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

我的问题是为什么我不能用n--替换n-1?或者我可以用--n替换它吗?

因为它更改了
n
的值。由于该值用于计算表达式
n*fact(…)
,因此必须在计算
fact
后读取
n
的值。由于必须将
--n
(或
n--
,此处无所谓)作为值传递给
fact
,因此减量必须在调用
fact
之前发生。因此,表达式结果将不正确。

有两个原因

第一,
n--
是后减量。用作分段的值将是
n
的原始(非递减)值


第二,
n
在表达式中使用了两次(一次作为
*
的左侧参数,一次在递归调用的参数中)。在这种情况下,C和C++都不指定评价顺序,所以不清楚<代码> n>代码>在代码> n—< /代码>之前(或甚至<代码> -n>代码>)。在<返回>表达式中使用“<代码> > n>代码>两次,在返回表达式中小心使用…请选择一种语言:C++!C(特别是如果你像测序一样进入角落和缝隙)@HolyBlackCat:在这段代码中,n-1和--n之间存在差异。使用--n将得到不正确的结果。我更愿意说“可能不正确”,它也有可能按照OP的预期进行计算(至少使用
--n
),这取决于在使用--n时传递给事实的值。对于0,它将崩溃,对于1,它将是正确的。然后它就不正确了,它不必崩溃,因为尾部递归可以优化为iteration@JamesBond若n被求值,然后递减,最后输入funct,它将产生正确的结果,这是完全可能的afaics@RemusRusanu也许吧,但这个问答不仅是为了OP,也是为了所有感兴趣的读者