将函数本身作为返回值返回

时间:2018-02-05 14:16:37

标签: c recursion

我有一个关于返回函数本身值的简单问题。当然,功能是递归的。 例如:

int CountDigs(int n)
{
  int dig=n%10;
  if(n < 10) return 0;
  if( (n/10)%10 > dig )
    return CountDigs(n/10)+1;
  return CountDigs(n/10);
}

我通常会返回一个数字或变量,所以这是我第一次看到这个。有人可以请说明&#34; + 1&#34;存储在内存中,为什么我不应该创建一个存储摘要的变量?

更具体地说,我疯了同样的解决方案,但不同:

int counting_function(int n)
{
    int sum;
    if (n>=9)
    return 0;
    sum = counting_function (n/10);
    if (n%10 < n/10%10)
    {
        sum++;
        return sum;
    }
    return sum;
}

3 个答案:

答案 0 :(得分:2)

return语句返回值时,该值由表达式指定。该表达式可以是一个简单的表达式,例如常量或变量名称,但它不需要。它可以是任何适当类型的有效表达式。

  

有人可以解释“+1”的值存储在内存中的位置,

这取决于编译器,但添加1可能的结果不是存储在系统内存中。更有可能的是,它永远不会离开CPU。

  

为什么我不应该创建一个存储摘要的变量?

将结果存储在变量中,然后使用变量的名称作为return表达式,没有任何内在错误。在某些情况下可能会更清楚。但即便如此,该值实际上可能不会存储到系统内存中。但是,如果将 存储到系统内存中,那么这将耗费更多时间。

这里要理解的关键是return语句指定直接返回,而不是间接返回。在大多数情况下,对于大多数编译器而言,这样的返回值通过CPU寄存器而不是系统存储器传递给调用者,尤其包括您熟悉的情况。

答案 1 :(得分:1)

return语句采用表达式并将其用作函数的返回值。

表达式可以是单个变量,调用函数的返回值,文字值或上述任意组合与任意数量的运算符组合在一起。

无需在变量中存储表达式,只将该变量传递给return。任何正确类型的表达都可以放在那里。

答案 2 :(得分:-1)

返回值取决于调用约定。在x86中,它们通常放在寄存器EAX中(如果需要更多空间,则放在EDX中)。编译器不需要一个名为的显式变量 - 最终将这些变量分解为内存地址和寄存器,在这种情况下(再次依赖于您的调用约定),数学在一些寄存器中完成,结果放在EAX中在弹出callstack时使用。